polylib
7.01
factors.c
Go to the documentation of this file.
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
5
typedef
struct
{
6
int
count
;
7
int
*
fac
;
8
}
factor
;
9
10
// compute the prime factors of n, including n itself if it is prime.
11
factor
prime_factors
(
int
n
)
12
{
13
int
tabsize = 10;
14
int
div = 2;
15
int
rest =
n
;
16
factor
result;
17
18
// result init
19
result.
count
= 0;
20
result.
fac
= malloc(tabsize *
sizeof
(
int
));
21
22
while
(div*div <= rest)
23
{
24
if
(rest % div == 0)
25
{
26
// double the size of the array if necessary
27
if
(result.
count
== tabsize)
28
{
29
tabsize *= 2;
30
result.
fac
= realloc(result.
fac
, tabsize *
sizeof
(
int
));
31
}
32
// add div to the result
33
result.
fac
[result.
count
++] = div;
34
rest /= div;
35
}
36
else
37
div += (1 + (1&div));
// 2, 3, 5, 7, 9, ...
38
}
39
if
(rest != 1)
40
{
41
// add rest
42
if
(result.
count
== tabsize)
43
{
44
tabsize += 1;
45
result.
fac
= realloc(result.
fac
, tabsize *
sizeof
(
int
));
46
}
47
result.
fac
[result.
count
++] = rest;
48
}
49
return
result;
50
}
51
52
// compute all numbers in [1, n[ dividing a given number n
53
factor
all_factors
(
int
n
)
54
{
55
// compute the prime decomposition (including n if it is prime)
56
factor
primes =
prime_factors
(
n
);
57
factor
result;
58
59
int
size = (1<<(primes.
count
));
// max size of result = 2^(prime.count)
60
result.
count
= 1;
61
result.
fac
= malloc(size *
sizeof
(
int
));
62
result.
fac
[0] = 1;
63
64
for
(
int
mask=1; mask < size; mask++) {
65
// multiply the prime factors for the bits that are 1 in the mask :)
66
int
val = 1;
67
for
(
int
bits=0, rest=mask; rest ; bits++, rest>>=1) {
68
if
((rest & 1))
69
val *= primes.
fac
[bits];
70
}
71
// add val to res.fac only if it is not already there
72
// (this will suppress duplicates, in case a prime factor is there several times)
73
if
(val > result.
fac
[result.
count
-1]) {
74
result.
fac
[result.
count
++] = val;
75
}
76
}
77
// always remove the last one, that is n.
78
result.
count
--;
79
80
free(primes.
fac
);
81
return
result;
82
}
83
84
85
// // test
86
// int main(int argc, char **argv)
87
// {
88
89
// // factor f = prime_factors(atoi(argv[1]));
90
// factor f = all_factors(atoi(argv[1]));
91
92
// for(int i=0; i<f.count; i++)
93
// {
94
// printf(" %d", f.fac[i]);
95
// }
96
// printf("\n");
97
98
// free(f.fac);
99
// return 0;
100
// }
all_factors
factor all_factors(int n)
Definition:
factors.c:53
prime_factors
factor prime_factors(int n)
Definition:
factors.c:11
n
static int n
Definition:
polyparam.c:278
factor
Definition:
factors.c:5
factor::fac
int * fac
Definition:
factors.c:7
factor::count
int count
Definition:
factors.c:6
source
kernel
factors.c
Generated by
1.9.4