我设法得到了Eulers Totient Function的一个版本,尽管它适用于较小的数字(与我需要计算的1024位数相比较小)为非常大的数字计算Eulers Totient函数JAVA
我的版本是在这里 -
public static BigInteger eulerTotientBigInt(BigInteger calculate) {
BigInteger count = new BigInteger("0");
for(BigInteger i = new BigInteger("1"); i.compareTo(calculate) < 0; i = i.add(BigInteger.ONE)) {
BigInteger check = GCD(calculate,i);
if(check.compareTo(BigInteger.ONE)==0) {//coprime
count = count.add(BigInteger.ONE);
}
}
return count;
}
尽管这适用于更小的数字,它的工作原理是通过各种可能从1到迭代次数来计算。对于大型BigIntegers,这是完全不可行的。
我读过,有可能在每次迭代中划分数字,不再需要逐个去遍历它们。我只是不确定我应该分成什么样的东西(我看过的一些例子是用C语言编写的,使用长整数和平方根 - 据我所知,我无法准确计算一个准确的数值我也想知道如果对于这样的模块化算法,函数是否需要包含一个说明mod是什么的参数,我完全不确定这个,所以任何建议都非常感谢。
任何人都可以点我在这里向正确的方向
PS我删除这个问题时,我发现我modifying Euler Totient Function适应它BigIntegers工作? -
public static BigInteger etfBig(BigInteger n) {
BigInteger result = n;
BigInteger i;
for(i = new BigInteger("2"); (i.multiply(i)).compareTo(n) <= 0; i = i.add(BigInteger.ONE)) {
if((n.mod(i)).compareTo(BigInteger.ZERO) == 0)
result = result.divide(i);
while(n.mod(i).compareTo(BigInteger.ZERO)== 0)
n = n.divide(i);
}
if(n.compareTo(BigInteger.ONE) > 0)
result = result.subtract((result.divide(n)));
return result;
}
它确实给出了一个准确的结果,当它传递一个1024位的数字时它会永久运行(我还不确定它是否完成,它已经运行了20分钟)。
过分简化,你必须能够因子n来计算1024位数的总功能。在涉及计算总功能的加密协议中,您已经有了总分解。 –