我尝试计算以下算法的时间复杂度。
private void encrypt()
{
M = new BigInteger(64,random);
C = M.multiply(k).mod(N); // O(n^2)
}
private void decrypt()
{
kk= k.modinverse(N); // O(n^3)
Mp = kk.multiply(c).mod(N); //O(n^2)
}
我计算时间复杂度了吗?
加密的时间复杂度为O(n ^ 2) 解密的时间复杂度为O(n ^ 3)+ O(n ^ 2)= O(n ^ 3)
答案 0 :(得分:2)
您的分析可能更详细,使用更好的界限进行数字倍增。它应该包含更多详细说明您在哪里获得使用过程的复杂性。
对于乘以大数字,您可以使用Karatsuba algorithm或Schönhage–Strassen algorithm转到O(n^1.585)
或更低(有关详细信息,请参阅链接的维基百科页面)。
构造一个新的整数并计算模N
的结果,其复杂性不会比线性更差。
因此,encrypt
程序的复杂性取决于所选的乘法算法。
decrypt()
程序也是如此。我不知道你在哪里得到modinverse
的复杂性。 Modular multiplicative inverse最多可以计算O(n^2)
。
模块化逆向维基百科页面中给出的复杂度为O(log(M)^2)
,使用数字的值表示,我们计算逆数。您的分析(通常在处理数论算法时完成)使用数字长度而不是它们的值,这使得复杂度O(N^2)
。