java在特定范围内找到一个biginteger

时间:2012-09-05 22:38:50

标签: java

我正在使用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;
}

3 个答案:

答案 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增加一些。