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