aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/factor.c
blob: 0232d4e543a6d2ec7282f3ef2d67e2e0dc1448aa (plain)
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
84
85
86
87
88
89
90
91
92
93
94
95
96
#include <u.h>
#include <libc.h>
#include <bio.h>

#define	whsiz	(sizeof(wheel)/sizeof(wheel[0]))

double	wheel[] =
{
	 2,10, 2, 4, 2, 4, 6, 2, 6, 4,
	 2, 4, 6, 6, 2, 6, 4, 2, 6, 4,
	 6, 8, 4, 2, 4, 2, 4, 8, 6, 4,
	 6, 2, 4, 6, 2, 6, 6, 4, 2, 4,
	 6, 2, 6, 4, 2, 4, 2,10,
};

Biobuf	bin;

void	factor(double);

void
main(int argc, char *argv[])
{
	double n;
	int i;
	char *l;

	if(argc > 1) {
		for(i=1; i<argc; i++) {
			n = atof(argv[i]);
			factor(n);
		}
		exits(0);
	}

	Binit(&bin, 0, OREAD);
	for(;;) {
		l = Brdline(&bin, '\n');
		if(l ==  0)
			break;
		n = atof(l);
		if(n <= 0)
			break;
		factor(n);
	}
	exits(0);
}

void
factor(double n)
{
	double quot, d, s;
	int i;

	print("%.0f\n", n);
	if(n == 0)
		return;
	s = sqrt(n) + 1;
	while(modf(n/2, &quot) == 0) {
		print("     2\n");
		n = quot;
		s = sqrt(n) + 1;
	}
	while(modf(n/3, &quot) == 0) {
		print("     3\n");
		n = quot;
		s = sqrt(n) + 1;
	}
	while(modf(n/5, &quot) == 0) {
		print("     5\n");
		n = quot;
		s = sqrt(n) + 1;
	}
	while(modf(n/7, &quot) == 0) {
		print("     7\n");
		n = quot;
		s = sqrt(n) + 1;
	}
	d = 1;
	for(i=1;;) {
		d += wheel[i];
		while(modf(n/d, &quot) == 0) {
			print("     %.0f\n", d);
			n = quot;
			s = sqrt(n) + 1;
		}
		i++;
		if(i >= whsiz) {
			i = 0;
			if(d > s)
				break;
		}
	}
	if(n > 1)
		print("     %.0f\n",n);
	print("\n");
}