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