注:该算法核心源于网络
(try-isPrime 4330632126147343 8)
4330632126147343这是用这个函数求出来目前最大的质数,你们可以试试传统算法,lsp验证一个这样级别的质数需要多少时间,反正我的电脑估计一个星期都可能跑不出来,几乎达到双精度的极限,感觉再往上就要用字符串来模拟数值计算了
;;快速乘取模
;;快速求出(a*b)mod m 的值
(defun quickMulMod(a b m / ret)
(setq ret 0)
(while (not(zerop b))
(if (not(zerop(rem b 2)))
(setq ret(rem(+ a ret)m))
)
(setq
b(fix(/ b 2))
a(rem(* a 2.)m)
)
)
(fix ret)
)
;;快速幂取模
;;快速求出(a^b)mod m 的值
(defun quickPowMod (a b m / ret)
(setq ret 1)
(while (not(zerop b))
(if (not(zerop(rem b 2)))
(setq ret(quickMulMod ret a m))
)
(setq
b(fix(/ b 2))
a(quickMulMod a a m)
)
)
ret
)
;;判断一个整数是否为质数
;;lsp中最大的整数为2147483647,超过则自动转为实数
;;本函数求出来的最大质数为4330632126147343,几乎达到双精度的极限
;;参数为一个整数,第二个参数为猜测次数,建议用8
(defun try-isPrime (n tt / a d i j k k2 r ret x)
(setq tt (min (- n 3) tt))
(if (or(> n 4330632126147343)(< n 2))(princ"\必须输入3-4330632126147343的整数"))
(if (= n 2)
T
(progn
(setq d(1- n)
r 0
)
(while (zerop(rem d 2))
(setq r(1+ r)d(/ d 2))
)
(setq i 0 k t ret t)
(while (and k(<= (setq i(1+ i)) tt))
(setq a(try_Ran-fix 2(- n 2))
x(quickPowMod a d n)
)
(if(not(or(= x 1)(= x (1- n))))
(progn
(setq j 0 k2 t)
(while (and k2(<= (setq j(1+ j)) r))
(setq x(quickMulMod x x n))
(if (= x(1- n))
(setq k2 nil)
)
)
(if k2
(setq k nil ret nil )
)
)