Little fix after the last commit (mostly a git fail)
[eigenmath-fx.git] / factor.cpp
blob8d71d67d9f61acf845797bb3eedc22c4e87ebdc3
1 // factor a polynomial or integer
3 #include "stdafx.h"
4 #include "defs.h"
6 void
7 eval_factor(void)
9 push(cadr(p1));
10 eval();
12 push(caddr(p1));
13 eval();
15 p2 = pop();
16 if (p2 == symbol(NIL))
17 guess();
18 else
19 push(p2);
21 factor();
23 // more factoring?
25 p1 = cdddr(p1);
26 while (iscons(p1)) {
27 push(car(p1));
28 eval();
29 factor_again();
30 p1 = cdr(p1);
34 void
35 factor_again(void)
37 int h, n;
39 save();
41 p2 = pop();
42 p1 = pop();
44 h = tos;
46 if (car(p1) == symbol(MULTIPLY)) {
47 p1 = cdr(p1);
48 while (iscons(p1)) {
49 push(car(p1));
50 push(p2);
51 factor_term();
52 p1 = cdr(p1);
54 } else {
55 push(p1);
56 push(p2);
57 factor_term();
60 n = tos - h;
62 if (n > 1)
63 multiply_all_noexpand(n);
65 restore();
68 void
69 factor_term(void)
71 save();
72 factorpoly();
73 p1 = pop();
74 if (car(p1) == symbol(MULTIPLY)) {
75 p1 = cdr(p1);
76 while (iscons(p1)) {
77 push(car(p1));
78 p1 = cdr(p1);
80 } else
81 push(p1);
82 restore();
85 void
86 factor(void)
88 save();
89 p2 = pop();
90 p1 = pop();
91 if (isinteger(p1)) {
92 push(p1);
93 factor_number(); // see pollard.cpp
94 } else {
95 push(p1);
96 push(p2);
97 factorpoly();
99 restore();
102 // for factoring small integers (2^32 or less)
104 void
105 factor_small_number(void)
107 int d, expo, i, n;
109 save();
111 n = pop_integer();
113 if (n == (int) 0x80000000)
114 stop("number too big to factor");
116 if (n < 0)
117 n = -n;
119 for (i = 0; i < MAXPRIMETAB; i++) {
121 d = primetab[i];
123 if (d > n / d)
124 break;
126 expo = 0;
128 while (n % d == 0) {
129 n /= d;
130 expo++;
133 if (expo) {
134 push_integer(d);
135 push_integer(expo);
139 if (n > 1) {
140 push_integer(n);
141 push_integer(1);
144 restore();