Vector Diffie Hellman——原始根模n——密码学问题
在下面的代码片段中,请从第一个“for”循环开始解释发生了什么以及原因。为什么添加0,为什么在第二个循环中添加1。bigi下的“if”语句中发生了什么。最后解释了modPow方法。提前感谢您有意义的回复Vector Diffie Hellman——原始根模n——密码学问题,vector,root,primitive,diffie-hellman,Vector,Root,Primitive,Diffie Hellman,在下面的代码片段中,请从第一个“for”循环开始解释发生了什么以及原因。为什么添加0,为什么在第二个循环中添加1。bigi下的“if”语句中发生了什么。最后解释了modPow方法。提前感谢您有意义的回复 public static boolean isPrimitive(BigInteger m, BigInteger n) { BigInteger bigi, vectorint; Vector<BigInteger> v = new Vector<BigI
public static boolean isPrimitive(BigInteger m, BigInteger n) {
BigInteger bigi, vectorint;
Vector<BigInteger> v = new Vector<BigInteger>(m.intValue());
int i;
for (i=0;i<m.intValue();i++)
v.add(new BigInteger("0"));
for (i=1;i<m.intValue();i++)
{
bigi = new BigInteger("" + i);
if (m.gcd(bigi).intValue() == 1)
v.setElementAt(new BigInteger("1"), n.modPow(bigi,m).intValue());
}
for (i=0;i<m.intValue();i++)
{
bigi = new BigInteger("" + i);
if (m.gcd(bigi).intValue() == 1)
{
vectorint = v.elementAt(bigi.intValue());
if ( vectorint.intValue() == 0)
i = m.intValue() + 1;
}
}
if (i == m.intValue() + 2)
return false;
else
return true;
}
公共静态布尔isPrimitive(BigInteger m,BigInteger n){
bigi,向量;
向量v=新向量(m.intValue());
int i;
对于(i=0;i
- 将向量视为布尔值列表,每个数字0到m对应一个布尔值。这样查看向量时,很明显,每个值都设置为0以将其初始化为false,然后设置为1以将其设置为true
- 最后一个for循环是测试所有布尔值。如果其中任何一个为0(表示false),则函数返回false。如果所有为true,则函数返回true
- 解释您询问的
if
语句需要解释什么是基元根mod n,这是函数的全部要点。我认为,如果您的目标是理解此程序,您应该首先了解它实现了什么。如果您阅读此语句,您将在第一段中看到:
在模运算中,一个分支
数论,本原根模
n是具有该性质的任意数g
n的任意数互质是
与g(mod n)的幂全等。
也就是说,如果g是一个基本根(mod
n) ,则对于具有
gcd(a,n)=1,有一个整数k
这样gk≡ a(mod n).k被称为
a的指数,也就是说,g是a
乘法群的生成元
模n的整数
- 函数实现。一旦您了解了如何查找基本根mod n,您就会理解它
也许你要做的最后一件事就是知道,如果两个数的最大公约数是1,那么它们是互质的。所以你可以在粘贴的算法中看到这些检查
奖励链接:有一些很好的背景,包括如何在结尾处测试原始根。这显然是家庭作业。我的问题是:为什么人们甚至不改变他们问题的文本,使其看起来与典型的家庭作业问题有所不同?“最后解释modPow方法。”…这让我很开心。