在下面的代码片段中,请从第一个“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;
}
答案 0 :(得分:1)
将向量视为布尔值列表,每个数字0到m都有一个布尔值。当您以这种方式查看时,很明显每个值都设置为0以将其初始化为false,然后设置为1以将其设置为true。
最后一个for循环是测试所有布尔值。如果它们中的任何一个为0(表示为false),则该函数返回false。如果全部为真,则该函数返回true。
解释您询问的if
语句需要解释原始根模型是什么,这是函数的全部要点。我想如果你的目标是理解这个程序,你应该先了解它的实现。如果您在其上阅读Wikipedia's article,则会在第一段中看到:
在模运算中,是一个分支 数论,原始根模数 n是具有该属性的任何数字g n的任何数字互质 与g(mod n)的幂相等。 也就是说,如果g是原始根(mod) n),然后对于每个具有的整数a gcd(a,n)= 1,有一个整数k 这样gk≡a(mod n)。 k被称为 a的索引。也就是说,g是一个 乘法组的生成器 整数模数n。
也许最后一块拼图就是要知道如果两个数字的最大公约数是1,则它们是 coprime 。所以你在你粘贴的算法中看到了这些检查。
奖金链接:This paper有一些很好的背景,包括如何测试最终附近的原始根。