我正在使用java开发一个应用程序,它需要找到满足这两个条件的两个大整数(Y和Z):
Y^k < N and Z^j < N < Z^(j+1)
N,k和j是已知的。 N是一个大整数(1024bit)。
我当前的实现通过选择随机BigInteger找到Y和Z并测试是否满足条件。但问题是,有时需要很长时间才能找到解决方案,或者根本找不到解决方案(可能没有正确计算bitSize)。 有什么方法可以加快速度吗?
代码:
BigInteger getMessage(int bitSize, int lowerBound, int upperBound, BigInteger module)
{
boolean foundOne = false;
BigInteger candidate = null;
while( !foundOne )
{
candidate = new BigInteger(bitSize,random);
foundOne = (upperBound == 0 || candidate.pow(upperBound).compareTo(module) > 0 ) && (lowerBound == 0 || candidate.pow(lowerBound).compareTo(module) < 0);
}
return candidate;
}
答案 0 :(得分:1)
一种方法是通过取表达式的对数直接求解方程式:
k * log (Y) < log (N)
=> log (Y) < log (N) / k
j * log (Z) < log (N) < (j + 1) * log (Z)
=> log (Z) < log (N) / j AND log (Z) > log (N) / (j + 1)
确定log(Y)
和log(Z)
的值后,您可以将结果的指数(对于neperian日志或log10的幂为10)返回到Y和Z. / p>
You can read here about various ways of calculating the log of a BigInteger。在BigDecimal上运行计算,然后向BigInteger舍入(向上或向下)并检查它是否有效似乎是明智的。
答案 1 :(得分:1)
使用二进制搜索。例如,要找到Z,以Zmin = 0和Zmax = N开始。计算Zmid =(Zmin + Zmax)/ 2,然后比较Zmid ^ j与N.如果Zmin ^ j < N,然后设置Zmin = Zmid。否则,设置Zmax = Zmid。最终,你将在O(log(N))时间内缩小到正确的Z值。
答案 2 :(得分:0)
请勿随意调整,根据与您想要匹配的规格的关系调整当前的猜测。
例如,从n = N / 2开始。
如果n ^ j&gt; N,然后将n降低一些量。
如果n ^ j&lt; N,然后检查n ^(j + 1)&gt; Ñ
如果n ^(j + 1)&lt; N,然后将n增加一些。
等