Vector Diffie Hellman——原始根模n——密码学问题

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

在下面的代码片段中,请从第一个“for”循环开始解释发生了什么以及原因。为什么添加0,为什么在第二个循环中添加1。bigi下的“if”语句中发生了什么。最后解释了modPow方法。提前感谢您有意义的回复

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方法。”…这让我很开心。