60 lines
1.7 KiB
Text
60 lines
1.7 KiB
Text
(de **Mod (X Y N)
|
|
(let M 1
|
|
(loop
|
|
(when (bit? 1 Y)
|
|
(setq M (% (* M X) N)) )
|
|
(T (=0 (setq Y (>> 1 Y)))
|
|
M )
|
|
(setq X (% (* X X) N)) ) ) )
|
|
(de isprime (N)
|
|
(cache '(NIL) N
|
|
(if (== N 2)
|
|
T
|
|
(and
|
|
(> N 1)
|
|
(bit? 1 N)
|
|
(let (Q (dec N) N1 (dec N) K 0 X)
|
|
(until (bit? 1 Q)
|
|
(setq
|
|
Q (>> 1 Q)
|
|
K (inc K) ) )
|
|
(catch 'composite
|
|
(do 16
|
|
(loop
|
|
(setq X
|
|
(**Mod
|
|
(rand 2 (min (dec N) 1000000000000))
|
|
Q
|
|
N ) )
|
|
(T (or (=1 X) (= X N1)))
|
|
(T
|
|
(do K
|
|
(setq X (**Mod X 2 N))
|
|
(when (=1 X) (throw 'composite))
|
|
(T (= X N1) T) ) )
|
|
(throw 'composite) ) )
|
|
(throw 'composite T) ) ) ) ) ) )
|
|
(de numbers (N)
|
|
(let (P 10 Q N)
|
|
(make
|
|
(until (> 10 Q)
|
|
(link
|
|
(+
|
|
(setq Q (/ N P))
|
|
(% N P) ) )
|
|
(setq P (* P 10)) ) ) ) )
|
|
(de ismagna (N)
|
|
(or
|
|
(> 10 N)
|
|
(fully isprime (numbers N)) ) )
|
|
(let (C 0 N 0 Lst)
|
|
(setq Lst
|
|
(make
|
|
(until (== C 401)
|
|
(when (ismagna N)
|
|
(link N)
|
|
(inc 'C) )
|
|
(inc 'N) ) ) )
|
|
(println (head 45 Lst))
|
|
(println (head 10 (nth Lst 241)))
|
|
(println (head 10 (nth Lst 391))) )
|