summaryrefslogtreecommitdiff
path: root/appl/math/factor.b
diff options
context:
space:
mode:
Diffstat (limited to 'appl/math/factor.b')
-rw-r--r--appl/math/factor.b180
1 files changed, 180 insertions, 0 deletions
diff --git a/appl/math/factor.b b/appl/math/factor.b
new file mode 100644
index 00000000..5f2aa775
--- /dev/null
+++ b/appl/math/factor.b
@@ -0,0 +1,180 @@
+#
+# initially generated by c2l
+#
+
+implement Factor;
+
+include "draw.m";
+
+Factor: module
+{
+ init: fn(nil: ref Draw->Context, argl: list of string);
+};
+
+include "sys.m";
+ sys: Sys;
+include "bufio.m";
+ bufio: Bufio;
+ Iobuf: import bufio;
+include "math.m";
+ maths: Math;
+ modf: import maths;
+
+init(nil: ref Draw->Context, argl: list of string)
+{
+ sys = load Sys Sys->PATH;
+ bufio = load Bufio Bufio->PATH;
+ maths = load Math Math->PATH;
+ main(len argl, argl);
+}
+
+WHLEN: con 48;
+wheel := array[WHLEN] of {
+ real 2,
+ real 10,
+ real 2,
+ real 4,
+ real 2,
+ real 4,
+ real 6,
+ real 2,
+ real 6,
+ real 4,
+ real 2,
+ real 4,
+ real 6,
+ real 6,
+ real 2,
+ real 6,
+ real 4,
+ real 2,
+ real 6,
+ real 4,
+ real 6,
+ real 8,
+ real 4,
+ real 2,
+ real 4,
+ real 2,
+ real 4,
+ real 8,
+ real 6,
+ real 4,
+ real 6,
+ real 2,
+ real 4,
+ real 6,
+ real 2,
+ real 6,
+ real 6,
+ real 4,
+ real 2,
+ real 4,
+ real 6,
+ real 2,
+ real 6,
+ real 4,
+ real 2,
+ real 4,
+ real 2,
+ real 10,
+};
+bin: ref Iobuf;
+
+main(argc: int, argv: list of string)
+{
+ n: real;
+ i: int;
+ l: string;
+
+ if(argc > 1){
+ argv = tl argv;
+ for(i = 1; i < argc; i++){
+ n = real hd argv;
+ factor(n);
+ argv = tl argv;
+ }
+ exit;
+ }
+ bin = bufio->fopen(sys->fildes(0), Sys->OREAD);
+ for(;;){
+ l = bin.gets('\n');
+ if(l == nil)
+ break;
+ n = real l;
+ if(n <= real 0)
+ break;
+ factor(n);
+ }
+ exit;
+}
+
+factor(n: real)
+{
+ quot, d, s: real;
+ i: int;
+
+ sys->print("%d\n", int n);
+ if(n == real 0)
+ return;
+ s = maths->sqrt(n)+real 1;
+ for(;;){
+ (iquot, frac) := modf(n/real 2);
+ if(frac != real 0)
+ break;
+ quot = real iquot;
+ sys->print(" 2\n");
+ n = quot;
+ s = maths->sqrt(n)+real 1;
+ }
+ for(;;){
+ (iquot, frac) := modf(n/real 3);
+ if(frac != real 0)
+ break;
+ quot = real iquot;
+ sys->print(" 3\n");
+ n = quot;
+ s = maths->sqrt(n)+real 1;
+ }
+ for(;;){
+ (iquot, frac) := modf(n/real 5);
+ if(frac != real 0)
+ break;
+ quot = real iquot;
+ sys->print(" 5\n");
+ n = quot;
+ s = maths->sqrt(n)+real 1;
+ }
+ for(;;){
+ (iquot, frac) := modf(n/real 7);
+ if(frac != real 0)
+ break;
+ quot = real iquot;
+ sys->print(" 7\n");
+ n = quot;
+ s = maths->sqrt(n)+real 1;
+ }
+ d = real 1;
+ for(i = 1;;){
+ d += wheel[i];
+ for(;;){
+ (iquot, frac) := modf(n/d);
+ if(frac != real 0)
+ break;
+ quot = real iquot;
+ sys->print(" %d\n", int d);
+ n = quot;
+ s = maths->sqrt(n)+real 1;
+ }
+ i++;
+ if(i >= WHLEN){
+ i = 0;
+ if(d > s)
+ break;
+ }
+ }
+ if(n > real 1)
+ sys->print(" %d\n", int n);
+ sys->print("\n");
+}
+