xref: /plan9/sys/src/cmd/factor.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 
5 #define	whsiz	(sizeof(wheel)/sizeof(wheel[0]))
6 
7 double	wheel[] =
8 {
9 	 2,10, 2, 4, 2, 4, 6, 2, 6, 4,
10 	 2, 4, 6, 6, 2, 6, 4, 2, 6, 4,
11 	 6, 8, 4, 2, 4, 2, 4, 8, 6, 4,
12 	 6, 2, 4, 6, 2, 6, 6, 4, 2, 4,
13 	 6, 2, 6, 4, 2, 4, 2,10,
14 };
15 
16 Biobuf	bin;
17 
18 void	factor(double);
19 
20 void
main(int argc,char * argv[])21 main(int argc, char *argv[])
22 {
23 	double n;
24 	int i;
25 	char *l;
26 
27 	if(argc > 1) {
28 		for(i=1; i<argc; i++) {
29 			n = atof(argv[i]);
30 			factor(n);
31 		}
32 		exits(0);
33 	}
34 
35 	Binit(&bin, 0, OREAD);
36 	for(;;) {
37 		l = Brdline(&bin, '\n');
38 		if(l ==  0)
39 			break;
40 		n = atof(l);
41 		if(n <= 0)
42 			break;
43 		factor(n);
44 	}
45 	exits(0);
46 }
47 
48 void
factor(double n)49 factor(double n)
50 {
51 	double quot, d, s;
52 	int i;
53 
54 	print("%.0f\n", n);
55 	if(n == 0)
56 		return;
57 	s = sqrt(n) + 1;
58 	while(modf(n/2, &quot) == 0) {
59 		print("     2\n");
60 		n = quot;
61 		s = sqrt(n) + 1;
62 	}
63 	while(modf(n/3, &quot) == 0) {
64 		print("     3\n");
65 		n = quot;
66 		s = sqrt(n) + 1;
67 	}
68 	while(modf(n/5, &quot) == 0) {
69 		print("     5\n");
70 		n = quot;
71 		s = sqrt(n) + 1;
72 	}
73 	while(modf(n/7, &quot) == 0) {
74 		print("     7\n");
75 		n = quot;
76 		s = sqrt(n) + 1;
77 	}
78 	d = 1;
79 	for(i=1;;) {
80 		d += wheel[i];
81 		while(modf(n/d, &quot) == 0) {
82 			print("     %.0f\n", d);
83 			n = quot;
84 			s = sqrt(n) + 1;
85 		}
86 		i++;
87 		if(i >= whsiz) {
88 			i = 0;
89 			if(d > s)
90 				break;
91 		}
92 	}
93 	if(n > 1)
94 		print("     %.0f\n",n);
95 	print("\n");
96 }
97