xref: /inferno-os/appl/math/factor.b (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1#
2#	initially generated by c2l
3#
4
5implement Factor;
6
7include "draw.m";
8
9Factor: module
10{
11	init: fn(nil: ref Draw->Context, argl: list of string);
12};
13
14include "sys.m";
15	sys: Sys;
16include "bufio.m";
17	bufio: Bufio;
18	Iobuf:  import bufio;
19include "math.m";
20	maths: Math;
21	modf: import maths;
22
23init(nil: ref Draw->Context, argl: list of string)
24{
25	sys = load Sys Sys->PATH;
26	bufio = load Bufio Bufio->PATH;
27	maths = load Math Math->PATH;
28	main(len argl, argl);
29}
30
31WHLEN: con 48;
32wheel := array[WHLEN] of {
33	real 2,
34	real 10,
35	real 2,
36	real 4,
37	real 2,
38	real 4,
39	real 6,
40	real 2,
41	real 6,
42	real 4,
43	real 2,
44	real 4,
45	real 6,
46	real 6,
47	real 2,
48	real 6,
49	real 4,
50	real 2,
51	real 6,
52	real 4,
53	real 6,
54	real 8,
55	real 4,
56	real 2,
57	real 4,
58	real 2,
59	real 4,
60	real 8,
61	real 6,
62	real 4,
63	real 6,
64	real 2,
65	real 4,
66	real 6,
67	real 2,
68	real 6,
69	real 6,
70	real 4,
71	real 2,
72	real 4,
73	real 6,
74	real 2,
75	real 6,
76	real 4,
77	real 2,
78	real 4,
79	real 2,
80	real 10,
81};
82bin: ref Iobuf;
83
84main(argc: int, argv: list of string)
85{
86	n: real;
87	i: int;
88	l: string;
89
90	if(argc > 1){
91		argv = tl argv;
92		for(i = 1; i < argc; i++){
93			n = real hd argv;
94			factor(n);
95			argv = tl argv;
96		}
97		exit;
98	}
99	bin = bufio->fopen(sys->fildes(0), Sys->OREAD);
100	for(;;){
101		l = bin.gets('\n');
102		if(l == nil)
103			break;
104		n = real l;
105		if(n <= real 0)
106			break;
107		factor(n);
108	}
109	exit;
110}
111
112factor(n: real)
113{
114	quot, d, s: real;
115	i: int;
116
117	sys->print("%d\n", int n);
118	if(n == real 0)
119		return;
120	s = maths->sqrt(n)+real 1;
121	for(;;){
122		(iquot, frac) := modf(n/real 2);
123		if(frac != real 0)
124			break;
125		quot = real iquot;
126		sys->print("     2\n");
127		n = quot;
128		s = maths->sqrt(n)+real 1;
129	}
130	for(;;){
131		(iquot, frac) := modf(n/real 3);
132		if(frac != real 0)
133			break;
134		quot = real iquot;
135		sys->print("     3\n");
136		n = quot;
137		s = maths->sqrt(n)+real 1;
138	}
139	for(;;){
140		(iquot, frac) := modf(n/real 5);
141		if(frac != real 0)
142			break;
143		quot = real iquot;
144		sys->print("     5\n");
145		n = quot;
146		s = maths->sqrt(n)+real 1;
147	}
148	for(;;){
149		(iquot, frac) := modf(n/real 7);
150		if(frac != real 0)
151			break;
152		quot = real iquot;
153		sys->print("     7\n");
154		n = quot;
155		s = maths->sqrt(n)+real 1;
156	}
157	d = real 1;
158	for(i = 1;;){
159		d += wheel[i];
160		for(;;){
161			(iquot, frac) := modf(n/d);
162			if(frac != real 0)
163				break;
164			quot = real iquot;
165			sys->print("     %d\n", int d);
166			n = quot;
167			s = maths->sqrt(n)+real 1;
168		}
169		i++;
170		if(i >= WHLEN){
171			i = 0;
172			if(d > s)
173				break;
174		}
175	}
176	if(n > real 1)
177		sys->print("     %d\n", int n);
178	sys->print("\n");
179}
180
181