polylib 7.01
factors.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3
4
5typedef struct {
6 int count;
7 int *fac;
8} factor;
9
10// compute the prime factors of n, including n itself if it is prime.
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
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// }
factor all_factors(int n)
Definition: factors.c:53
factor prime_factors(int n)
Definition: factors.c:11
static int n
Definition: polyparam.c:278
Definition: factors.c:5
int * fac
Definition: factors.c:7
int count
Definition: factors.c:6