如何确定此代码的时间复杂度?我猜modPow方法是最“昂贵的”。
import java.math.BigInteger;
public class FermatOne
{
public static void main(String[] args)
{
BigInteger a = new BigInteger ("2");
BigInteger k = new BigInteger ("15");
BigInteger c = new BigInteger ("1");
int b = 332192810;
BigInteger n = new BigInteger ("2");
BigInteger power;
power = a.pow(b);
BigInteger exponent;
exponent = k.multiply(power);
BigInteger mod;
mod = exponent.add(c);
BigInteger result = n.modPow(exponent,mod);
System.out.println("Result is ==> " + result);
}
}
答案 0 :(得分:4)
这个特定代码确定性地运行在O(1)
。
但是,对于任意变量的更一般术语,multiply()
将在O(nlog n)
中运行,其中n
是位数。
pow()
和O(log b)
, a
方法将在b
中运行。这是通过exponentiation by squaring实现的。对于较大的值,位数变大(线性),因此乘法需要更多时间。我会让你知道确切的分析。
我不是100%关于modPow()
的详细信息,但我怀疑它与pow()
的运行方式类似,除了在求幂的每一步中通过平方加上mod
。因此,它仍然是O(log b)
次乘法,并且额外的好处是位数由log m
限定,其中m
是mod。
答案 1 :(得分:0)
tskuzzy是正确的。
但也许在线之间阅读,并假设这是一个家庭作业问题,他们可能希望你意识到这种方法中发生了几个具有不同复杂性的操作。然后他们可能希望您意识到整个方法的复杂性与方法中发生的最复杂操作无关。