我正在尝试在有限域模数GF(8191)中进行一些求幂,我不确定为什么我得不到一致的结果。
我将这些公式进行比较:与和应该返回相同的结果(至少它在中执行)
Sage代码非常简单:
num, a = 42, 5000
# IN THE REAL DOMAIN:
k = float(num)^(a/(a-1))
print 'k=%f' % k
print 'real (A):', float(k^((a-1)/a)), float(k*((1/k)^(1/a)))
print 'real (B):', float(k^((a-1)/a)), float(k*(1/(k^(1/a))))
print 'real (C):', float(k^((a-1)/a)), float(k*(k^(-1/a)))
print
# NOW IN A FINITE FIELD:
order = 8191 # Field of prime size 2^13-1
# variable inv_a for convenience: 1/a and 1(a-1)
inv_a = inverse_mod(a, order)
inv_a1 = inverse_mod(a-1, order)
k = power_mod(num, a*inv_a1, order) # same "num" as in the Real domain
inv_k = inverse_mod(k, order) # 1/k
print 'k=%d' % k
print 'finite (A):', power_mod(k, (a-1)*inv_a, order), k*power_mod(inv_k, inv_a, order) % order
print 'finite (C):', power_mod(k, (a-1)*inv_a, order), k*power_mod(k, -inv_a, order) % order
哪个输出:
k=42.031414
real (A): 42.0 42.0
real (B): 42.0 42.0
real (C): 42.0 42.0
k=416
finite (A): 5080 7898
finite (C): 5080 7898
在有限域中,我期望公式给出相同的结果,就像在实数的交换字段中一样,但我得到5080
和7898
而不是42
。
如果你知道原因,谢谢你让我知道。特别是如果代码有问题。
答案 0 :(得分:1)
模块化算术不适用于指数,指数是整数而不是有限域元素。例如,在字段GF(3)中,我们具有1 = 4,但是2 1 ≠2 4 (后一元素是16,其是1 mod 3)。因此,通过计算有限域中a的倒数然后将k提高到该幂来获得k 1 / a 的想法是行不通的。在有限域中扎根是很困难的(当它们存在时),这在密码学中很有用。
Sage有taking roots in finite fields的内置函数:
F = GF(8191)
num = F(51)
a = 5000
print num.nth_root(a)
打印781.你的例子,42,抛出一个错误,因为它不是这个字段中任何元素的5000次幂,因此没有第5000个根。
设r = num.nth_root(a)
,我们现在可以通过将r提高到幂(a-1)或将num除以r来计算num (a-1)/ a ;一样。
print num/r, r^(a-1)
为两者打印2643。
根源一般不是唯一的。要获得所有这些,请使用
print num.nth_root(a, all=True)
打印[781,7997,1936,7364,4453,7410,194,6255,827,3738]