在素数有限域中的分数幂的指数

时间:2017-11-18 20:07:38

标签: sage exponentiation modular-arithmetic

我正在尝试在有限域模数GF(8191)中进行一些求幂,我不确定为什么我得不到一致的结果。

我将这些公式进行比较:k^((a-1)/a)k*(1/k)^(1/a)k*k^(-1/a)应该返回相同的结果(至少它在R中执行)

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

在有限域中,我期望公式给出相同的结果,就像在实数的交换字段中一样,但我得到50807898而不是42

如果你知道原因,谢谢你让我知道。特别是如果代码有问题。

1 个答案:

答案 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]