我用Java编写了一个程序,该程序可以计算2的幂,但是效率似乎很低。对于较小的功率(例如2 ^ 4000),它会在不到一秒钟的时间内完成。但是,我正在计算2 ^ 43112609,这比已知的最大质数大1。数字超过1200万,将需要很长时间才能运行。到目前为止,这是我的代码:
import java.io.*;
public class Power
{
private static byte x = 2;
private static int y = 43112609;
private static byte[] a = {x};
private static byte[] b = {1};
private static byte[] product;
private static int size = 2;
private static int prev = 1;
private static int count = 0;
private static int delay = 0;
public static void main(String[] args) throws IOException
{
File f = new File("number.txt");
FileOutputStream output = new FileOutputStream(f);
for (int z = 0; z < y; z++)
{
product = new byte[size];
for (int i = 0; i < a.length; i++)
{
for (int j = 0; j < b.length; j++)
{
product[i+j] += (byte) (a[i] * b[j]);
checkPlaceValue(i + j);
}
}
b = product;
for (int i = product.length - 1; i > product.length - 2; i--)
{
if (product[i] != 0)
{
size++;
if (delay >= 500)
{
delay = 0;
System.out.print(".");
}
delay++;
}
}
}
String str = "";
for (int i = (product[product.length-1] == 0) ?
product.length - 2 : product.length - 1; i >= 0; i--)
{
System.out.print(product[i]);
str += product[i];
}
output.write(str.getBytes());
output.flush();
output.close();
System.out.println();
}
public static void checkPlaceValue(int placeValue)
{
if (product[placeValue] > 9)
{
byte remainder = (byte) (product[placeValue] / 10);
product[placeValue] -= 10 * remainder;
product[placeValue + 1] += remainder;
checkPlaceValue(placeValue + 1);
}
}
}
这不是用于学校项目或其他任何项目;就是图个好玩儿。任何有关如何使其更有效的帮助将不胜感激!谢谢!
凯尔
附言我没有提到输出应该以10为底,而不是二进制。
最佳答案
这里的关键是要注意:
2^2 = 4
2^4 = (2^2)*(2^2)
2^8 = (2^4)*(2^4)
2^16 = (2^8)*(2^8)
2^32 = (2^16)*(2^16)
2^64 = (2^32)*(2^32)
2^128 = (2^64)*(2^64)
... and in total of 25 steps ...
2^33554432 = (2^16777216)*(16777216)
然后,由于:
2^43112609 = (2^33554432) * (2^9558177)
您可以使用相同的方法找到剩余的
(2^9558177)
,并且由于(2^9558177 = 2^8388608 * 2^1169569)
,您可以使用相同的方法找到2^1169569
;由于(2^1169569 = 2^1048576 * 2^120993)
,您可以使用相同的方法找到2^120993
,依此类推...编辑:以前在本节中有一个错误,现在已修复:
另外,请注意以下事项以进一步简化和优化:
2^43112609 = 2^(0b10100100011101100010100001)
2^43112609 =
(2^(1*33554432))
* (2^(0*16777216))
* (2^(1*8388608))
* (2^(0*4194304))
* (2^(0*2097152))
* (2^(1*1048576))
* (2^(0*524288))
* (2^(0*262144))
* (2^(0*131072))
* (2^(1*65536))
* (2^(1*32768))
* (2^(1*16384))
* (2^(0*8192))
* (2^(1*4096))
* (2^(1*2048))
* (2^(0*1024))
* (2^(0*512))
* (2^(0*256))
* (2^(1*128))
* (2^(0*64))
* (2^(1*32))
* (2^(0*16))
* (2^(0*8))
* (2^(0*4))
* (2^(0*2))
* (2^(1*1))
还要注意
2^(0*n) = 2^0 = 1
使用此算法,您可以25次乘法计算
2^1
,2^2
,2^4
,2^8
,2^16
... 2^33554432
的表。然后,您可以将43112609
转换为其二进制表示形式,并使用少于25个乘法轻松地找到2^43112609
。总共,您需要使用少于50个乘法来查找2^n
在0到67108864之间的任何n
。