Repository navigation
Expand file tree
/
Copy pathfactor_iterator.c
More file actions
83 lines (65 loc) · 1.72 KB
/
Copy pathfactor_iterator.c
File metadata and controls
83 lines (65 loc) · 1.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// Licensed under the MIT License.
#include <math.h>
#include "factor_iterator.h"
void factor_begin(FactorIterator iterator, long long n, Sieve primes)
{
iterator->remainder = n;
sieve_begin(&iterator->iterator, primes);
factor_next(iterator);
}
bool factor_end(FactorIterator iterator)
{
return !iterator->remainder;
}
void factor_next(FactorIterator iterator)
{
if (iterator->remainder == 1)
{
iterator->current = iterator->iterator.current;
iterator->remainder = 0;
iterator->exponent = 1;
return;
}
while (iterator->remainder % iterator->iterator.current != 0)
{
sieve_next(&iterator->iterator);
}
iterator->current = iterator->iterator.current;
iterator->remainder /= iterator->current;
iterator->exponent = 1;
while (iterator->remainder % iterator->current == 0)
{
iterator->remainder /= iterator->current;
iterator->exponent++;
}
}
int factor_divisor_count(long long n, Sieve primes)
{
int result = 1;
struct FactorIterator it;
for (factor_begin(&it, n, primes); !factor_end(&it); factor_next(&it))
{
result *= it.exponent + 1;
}
return result;
}
int factor_divisor_sum(long long n, Sieve primes)
{
int result = 1;
struct FactorIterator it;
for (factor_begin(&it, n, primes); !factor_end(&it); factor_next(&it))
{
result *= (pow(it.current, it.exponent + 1) - 1) / (it.current - 1);
}
return result;
}
int factor_sum(long long n, Sieve primes)
{
long long sum = 0;
struct FactorIterator it;
for (factor_begin(&it, n, primes); !factor_end(&it); factor_next(&it))
{
sum += it.exponent * it.current;
}
return sum;
}