\* (factor N M L), N = (hd (p)), M = (length (p)) - 1, L = (r), r = p x p.
(factor 7 6 [5 8 3 5 6 0 1 6 8 7 0 3 2 1]) = [7 6 3 9 1 1 1]
(factor 6 4 [3 8 6 7 4 7 1 7 2 1]) = [6 2 1 8 9]
(factor 1 7 [2 3 8 6 0 0 5 0 9 9 9 6 6 0 1] = [1 5 4 4 6 6 9 9] *\
(define factor
F Len L -> (factor-h F Len (drop 4 L) (hd (drop 3 L)) (hd (drop 3 L))
(+ (* 10 (- (num (take 2 L)) (* F F))) (hd (drop 2 L)))
[] 0 0 [] [])
where (or (> (* F F) 10) (> (* F F) (hd L) ))
F Len L -> (factor-h F Len (drop 3 L) (hd (drop 2 L)) (hd (drop 2 L))
(+ (* 10 (- (hd L) (* F F))) (hd (tl L))) [] 0 0 [] []))
(define factor-h
F 0 L Lh Lhp U S C P1 P2 Ans -> (append [F] Ans)
F Len L Lh Lhp U S C P1 P2 Ans -> (factor-h F (- Len 1) (tl L) (hd L) Lh
(fr 1 F Lh U C Ans) S 1
(fr 3 F Lh U C Ans) (fr 4 F Lh U C Ans)
(fr 2 F Lh U C Ans))
where (= C 0)
F Len L Lh Lhp U S C P1 P2 Ans -> (factor-h F Len L Lh Lhp P1 S 1 P1 P2 (append (drop -1 Ans) P2))
where (= error
(fr1 1 F (hd L) (fr 1 F Lh U C Ans) C
(append Ans (fr 2 F Lh U C Ans)) ))
F Len L Lh Lhp U S C P1 P2 Ans -> (factor-h F (+ Len 1) (append [Lh] L)
Lhp Lhp (hd S)[(hd S)] 1 (hd S)
[(- (hd (take -2 Ans)) 1)]
(append (drop -2 Ans)
[(- (hd (take -2 Ans)) 1)]))
where (= 10 (hd (reverse Ans)))
F Len L Lh Lhp U S C P1 P2 Ans -> (factor-h F (- Len 1) (tl L) (hd L) Lh
(fr 1 F Lh U C Ans)
(append (tl S) [(fr 3 F Lh U C Ans)]) 1
(fr 3 F Lh U C Ans) (fr 4 F Lh U C Ans)
(append Ans (fr 2 F Lh U C Ans)))
where (> (length S) 1)
F Len L Lh Lhp U S C P1 P2 Ans -> (factor-h F (- Len 1) (tl L) (hd L) Lh
(fr 1 F Lh U C Ans)
(append S [(fr 3 F Lh U C Ans)]) 1
(fr 3 F Lh U C Ans) (fr 4 F Lh U C Ans)
(append Ans (fr 2 F Lh U C Ans))))
(define fr
P F Lh U C Ans -> (from1 P (factor-hh0 Lh U C (desc (axg F F 0 U)) Ans)) where (= C 0)
P F Lh U C Ans -> (from1 P (factor-hh1 Lh U C (desc (axg F F (mid Ans) U)) Ans)))
(define fr1
P F Lh U C Ans -> (from1 P (factor-hh2 Lh U C (desc (axg F F (mid Ans) U)) Ans)))
(define factor-hh0
Lh U C [] Ans -> [errorhh0]
Lh U C [A] Ans -> [(nxt Lh U A) [(from1 2 A)] 10 [10]]
Lh U C [X|Y] Ans -> [(nxt Lh U X) [(from1 2 X)] (nxt Lh U (hd Y)) [(from1 2 (hd Y))]]
where (>= (nxt Lh U X) (mid [(from1 2 X)]))
Lh U C [X|Y] Ans -> (factor-hh0 Lh U C Y Ans))
(define factor-hh1
Lh U C [] Ans -> [999]
Lh U C [A] Ans -> [(nxt Lh U A) [(from1 2 A)] 10 [10]]
Lh U C [X|Y] Ans -> [(nxt Lh U X) [(from1 2 X)] (nxt Lh U (hd Y)) [(from1 2 (hd Y))]]
where (>= (nxt Lh U X) (mid (append Ans [(from1 2 X)])))
Lh U C [X|Y] Ans -> (factor-hh1 Lh U C Y Ans))
(define factor-hh2
Lh U C [] Ans -> [error]
Lh U C [X|Y] Ans -> [ok] where (>= (nxt Lh U X) (mid [(from1 2 X)]))
Lh U C [X|Y] Ans -> (factor-hh2 Lh U C Y Ans))
(define nxt
Lh U X -> (num [(- U (hd X)) Lh]))
(define mid
L -> (adds (timesL L (reverse L))))
(define num
L -> (num-h (reverse L) 1 0))
(define num-h
[] Unit Ans -> Ans
[X|Y] Unit Ans -> (num-h Y (* Unit 10) (+ Ans (* X Unit)) ))
(define desc
L -> (desc-h L (length L) []))
(define desc-h
L 0 Ans -> (reverse (append L Ans))
[X|Y] Len Ans -> (desc-h Y (- Len 1) (cons X Ans)) where (greater? (hd X) Y)
[X|Y] Len Ans -> (desc-h (append Y [X]) Len Ans))
(define greater?
XH [] -> true
XH [Y1|Y2] -> false where (not (>= XH (hd Y1)))
XH [Y1|Y2] -> (greater? XH Y2))
(define max
L Max -> (max-h L Max []))
(define max-h
[] _ Ans -> Ans
[X|Y] Max Ans -> (max-h Y Max (cons X Ans))
where (and (= (from1 2 X) (from1 3 X))
(<= (hd X) Max))
[X|Y] Max Ans -> (max-h Y Max Ans))
(define axg
N1 N2 N3 Max -> (axg-h N1 N2 N3 Max 0 []))
(define axg-h
_ _ _ _ 10 Ans -> (clean Ans)
N1 N2 N3 Max C Ans -> (axg-h N1 N2 N3 Max (+ C 1) Ans)
where (= (aag1 N1 N2 N3 C) [])
N1 N2 N3 Max C Ans -> (axg-h N1 N2 N3 Max (+ C 1)
(cons (max (aag1 N1 N2 N3 C) Max) Ans))
where (not (= [] (max (aag1 N1 N2 N3 C) Max)))
N1 N2 N3 Max C Ans -> (axg-h N1 N2 N3 Max (+ C 1) Ans))
(define aag1
N1 N2 N3 A -> (aag1-h 0 0 N1 N2 N3 A []))
(define aag1-h
C C0 N1 N2 N3 A Ans -> (aag1-h (+ C 1) 0 N1 N2 N3 A Ans) where (= C0 10)
C C0 N1 N2 N3 A Ans -> (aag1-h C (+ C0 1) N1 N2 N3 A
(cons [(+ (* N1 C) (* N2 C0) N3) C C0] Ans))
where (= A (hd (reverse (splita (reverse [(+ (* N1 C) (* N2 C0) N3)])))))
C C0 N1 N2 N3 A Ans -> (aag1-h C (+ C0 1) N1 N2 N3 A Ans))
(define split
L -> (append [(quot (hd L) 10)][(rem (hd L) 10)])
where (and (= (tl L) []) (>= (hd L) 10))
L -> [(hd L)] where (and (= (tl L) []) (< (hd L) 10))
L -> (split0 L []))
(define split0
[] Ans -> (append (split [(hd Ans)]) (tl Ans))
[X X1|Y] Ans ->(split0 Y
(append [(+ X1 (quot X 10))]
[(rem X 10)] Ans)) where (>= X 10)
[X|Y] Ans -> (split0 Y (append [X] Ans)))
(define splita0
L -> (if (= L (split (reverse L))) L (splita0 (split (reverse L)))))
(define splita
L -> (splita0 (split L)))
(define rem
N D -> N where (< N D)
N D -> (rem (- N D) D))
(define quot
L N -> (intpart (/ L N)))
(define take0
0 M _ -> (reverse M)
N M [X|Y] -> (take0 (- N 1) (cons X M) Y))
(define take
N L -> (if (< N 0) (drop (- (length L) (abs N)) L) (take0 N [] L)))
(define drop
0 L -> L
N L -> (if (< N 0) (take (- (length L) (abs N)) L) (drop (- N 1) (tl L))))
(define add0
[] N -> N
[X|Y] N -> (if (= X null) (add0 Y N) (add0 Y (+ N X))))
(define adds
L -> [] where (= L [])
L -> (add0 L 0))
(define timesL
_ [] -> []
_ [err] -> [[null multiply]]
_ [err1] -> [unequal length]
L M -> (timesL _ [err1]) where (not (= (length L) (length M)))
L M -> (if (or (= (hd L) null) (= (hd M) null)) (timesL _ [err]) (reverse (timesL0 L M []))))
(define timesL0
_ [] A -> A
[X|Y][P|Q] A -> (timesL0 Y Q (cons (* X P) A)))
(define clean
[] -> []
[X|Y] -> (if (or (symbol? X) (number? X)) (append [X] (clean Y)) (append X (clean Y))))
(define cleanall
L -> (if (= (clean L) L) L (cleanall (clean L))))
(define abs
N -> (* N -1) where (< N 0)
N -> N)
(define from1
1 L -> (hd L)
N L -> (from1 (- N 1) (tl L)))
(define from
0 L -> (hd L)
N L -> (from (- N 1) (tl L)))