我有点陷入群论的深渊,我对我拥有的密码学课程有点迷茫。基本上,我必须在java中实现的实用方法是,
顺序(质数,因素列表 P-1 , 任何 a(
这应该返回 Z*p 组中 a 的顺序,其中 f 是 p-1 的素因数列表。确保您的方法在 f 包含重复项时有效。例如,考虑 p=17 的情况
这是我到目前为止所拥有的,(取自我的笔记中的步骤(
public static BigInteger order(BigInteger p, List<BigInteger> f, BigInteger a){
//Algorithm starts like this
//Start by setting t equal to p-1 i.e t= p1 p2...pn
BigInteger t = p.subtract(BigInteger.ONE);
for(BigInteger pi : f){
//test if a^t1 = 1 mod p where t1 = t/pi
BigInteger t1 = t.divide(pi);
if(Practical5ExponentiationModMSquareAndMultiply.expm(p, a, t1).equals(BigInteger.ONE)){
t = t1;
System.out.println("t after mod = "+t);
System.out.println("pi after mod = "+pi);
}
}
return t;
}
质因数 F 的列表由另一种方法生成,然后传入
我手上的笔记很难理解,我想知道是否有人可以告诉我我实际上应该返回什么。你也可以让我对这个群论片段有一个可能的了解,因为它可以帮助我进一步的实践
您正在寻找最小的数字o
以便a^o == 1 (mod p)
,即最小的 o
这样p
a^o - 1
划分.
您需要的群论结果是整数 mod p 的乘法群是 p-1 阶的循环。这意味着:
o
的顺序划分p-1
并满足a^o == 1 (mod p)
o
阶是满足上述条件的最小数字。
因此,你可以通过取p-1
的素因数来找到顺序,并反复除以p-1
,直到p
除a^n - 1
不再正确。
示例 1:p = 13,p-1 = 2*2*3,a = 5。
对于 p = 2,5^(12/2( == 12 (mod 13(,所以你不能在订单中丢失 2。
对于 p = 3, 5^(12/3( == 1 (mod 13(,因此您可能会在订单中丢失 3。
因此,阶数为 2*2 = 4。
给你的例子(p = 17(是另一个说明性案例:
示例 2:p = 17,p-1 = 2*2*2*2,a = 9
9^(16/2( == 1 (mod 17(,所以你可以失去前 2。
9^(16/4( == 16 (mod 17(,所以你不能丢失第二个 2,你可以停止搜索。
因此,阶数为 2*2*2 = 8。
希望这应该足以让您看到算法。