|
发表于 2021-7-7 17:52:58
本帖最后由 ctfer 于 2021-7-7 17:54 编辑
高级数论函数
以下函数基于 David Cleaver 的 mpz_lucas.c 和 mpz_prp.c。
可能素数测试的一个很好的参考是 http://www.pseudoprime.com/pseudo.html
is_bpsw_prp(...)
如果n是 Baillie-Pomerance-Selfridge-Wagstaff 可能素数,is_bpsw_prp(n) 将返回 True 。BPSW 可能素数通过 is_strong_prp() 测试,基数为 2 和 is_selfridge_prp() 测试。
is_euler_prp(...)
is_euler_prp(n,a) 将返回 True 如果n是欧拉(也称为 Solovay-Strassen)可能素数到基地a。
假设:
gcd(n, a) == 1
n 是奇数
那么欧拉可能素数要求:
a**((n-1)/2) == 1 (mod n)
is_extra_strong_lucas_prp(...)
如果n是具有参数 (p,1) 的超强 Lucas 可能素数,则 is_extra_strong_lucas_prp(n,p) 将返回 True 。
假设:
n 是奇数
D = p*p - 4, D != 0
gcd(n, 2*D) == 1
n = s*(2**r) + Jacobi(D,n), s 奇数
那么一个超强的 Lucas 可能素数需要:
lucasv(p,1,s) == 0 (mod n)
或者
lucasv(p,1,s) == +/- 2 (mod n)
或者
lucasv(p,1,s*(2**t)) == 0 (mod n) 对于某些 t, 0 <= t < r
is_fermat_prp(...)
如果n是基 a 的费马可能素数,is_fermat_prp(n,a) 将返回 True 。
假设:
gcd(n,a) == 1
那么费马可能素数要求:
a**(n-1) == 1 (mod n)
is_fibonacci_prp(...)
is_fibonacci_prp(n,p,q) 如果n是带有参数 (p,q) 的斐波那契可能素数,则返回 True 。
假设:
n 是奇数
p > 0, q = +/-1
p*p - 4*q != 0
那么斐波那契可能素数要求:
lucasv(p,q,n) == p (mod n)。
is_lucas_prp(...)
is_lucas_prp(n,p,q) 将返回 True 如果n是一个带有参数 (p,q) 的 Lucas 可能素数。
假设:
n 是奇数
D = p*p - 4*q, D != 0
gcd(n, 2*q*D) == 1
那么一个 Lucas 可能素数需要:
lucasu(p,q,n - Jacobi(D,n)) == 0 (mod n)
is_selfridge_prp(...)
如果n是带有 Selfidge 参数 (p,q) 的 Lucas 可能素数,则 is_selfridge_prp(n) 将返回 True 。Selfridge 参数是通过找到序列 {5, -7, 9, -11, 13, ...} 中的第一个元素 D 来选择的,这样 Jacobi(D,n) == -1。设 p=1 且 q = (1-D)/4,然后执行 Lucas 可能素数检验。
is_strong_bpsw_prp(...)
如果n是强 Baillie-Pomerance-Selfridge-Wagstaff 可能素数,则 is_strong_bpsw_prp(n) 将返回 True 。一个强 BPSW 可能素数通过 is_strong_prp() 以 2 为底的测试和 is_strongselfridge_prp() 测试。
is_strong_lucas_prp(...)
is_strong_lucas_prp(n,p,q) 将返回 True 如果n是一个带有参数 (p,q) 的强 Lucas 可能素数。
假设:
n 是奇数
D = p*p - 4*q, D != 0
gcd(n, 2*q*D) == 1
n = s*(2**r) + Jacobi(D,n), s 奇数
那么一个强 Lucas 可能素数需要:
lucasv(p,q,s) == 0 (mod n)
或者
lucasv(p,q,s*(2**t)) == 0 (mod n) 对于某些 t, 0 <= t < r
is_strong_prp(...)
如果n是基 a 的强(也称为 Miller-Rabin)可能素数,则is_strong_prp(n,a) 将返回 True 。
假设:
gcd(n,a) == 1
n 是奇数
n = s*(2**r) + 1,s 奇数
那么一个强可能素数要求以下条件之一为真:
a**s == 1 (mod n)
或者
a**(s*(2**t)) == -1 (mod n) 对于某些 t,0 <= t < r。
is_strong_selfridge_prp(...)
如果n是具有 Selfidge 参数 (p,q) 的强 Lucas 可能素数,则 is_strong_selfridge_prp(n) 将返回 True 。Selfridge 参数是通过找到序列 {5, -7, 9, -11, 13, ...} 中的第一个元素 D 来选择的,这样 Jacobi(D,n) == -1。设 p=1 且 q = (1-D)/4,然后执行强 Lucas 可能素数检验。
lucasu(...)
lucasu(p,q,k) 将返回由 p,q 定义的 Lucas U 序列的第 k 个元素。p*p - 4*q 不能等于 0;k 必须大于或等于 0。
lucasu_mod(...)
lucasu_mod(p,q,k,n) 将返回由 p,q (mod n) 定义的 Lucas U 序列的第 k 个元素。p*p - 4*q 不能等于 0;k 必须大于或等于 0;n 必须大于 0。
lucasv(...)
lucasv(p,q,k) 将返回由参数 (p,q) 定义的 Lucas V 序列的第 k 个元素。p*p - 4*q 不能等于 0;k 必须大于或等于 0。
lucasv_mod(...)
lucasv_mod(p,q,k,n) 将返回由参数 (p,q) (mod n) 定义的 Lucas V 序列的第 k 个元素。p*p - 4*q 不能等于 0;k 必须大于或等于 0;n 必须大于 0。
|
|