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