这个问题在这里已有答案:
我需要计算一下:2894135 ^ 3787313 mod 4028033
正如你在下面看到的,我试图使用BigInteger因为我有非常大的数字。
import java.lang.Math;
import java.util.Scanner;
public class BigInteger extends Number implements Comparable<BigInteger>
{
public static void main(String[] args)
{
BigInteger result=new BigInteger(Math.pow(2894135,3787313) % 4028033);
System.out.println(result);
}
}
错误:
/tmp/java_Wcf144/BigInteger.java:19:错误:BigInteger不是抽象的,并且不会覆盖抽象方法doubleValue()中的数字公共类BigInteger extends Number实现Comparable ^ /tmp/java_Wcf144/BigInteger.java:24:错误:构造函数BigInteger类中的BigInteger不能应用于给定的类型; BigInteger结果= new BigInteger(Math.pow(2894135,3787313)%4028033); ^ required:找不到参数:double reason:实际和形式参数列表长度不同2错误
即使解决了错误,你也会得到错误的答案,因为Math.pow(2894135,3787313)
,这将导致overflow
中的double
,它将返回双Double.MAX_VALUE
的最大可能值。
因此,您需要在将它们转换为BigInteger
后执行所有操作。
import java.lang.Math;
import java.util.Scanner;
import java.math.BigInteger;
public class Main
{
public static void main(String[] args)
{
BigInteger a=BigInteger.valueOf(2894135);
BigInteger b=BigInteger.valueOf(3787313);
BigInteger m=BigInteger.valueOf(4028033);
BigInteger result=a.modPow(b,m); //calculates a^b %m
System.out.println(result);
}
}
编辑:如果你想以更优化的方式做到这一点,那么你可以使用Modular Exponentiation的概念。这将给出O(log(exponent))
复杂性的输出。在这里你不能使用更大的值,因为它可能导致overflow
中的long
,最终导致错误的结果。
码:
public class Main
{
public static void main(String[] args)
{
long a=2894135;
long b=3787313;
long m=4028033;
long result=modularExponentiation(a,b,m);
System.out.println(result);
}
static long modularExponentiation(long a,long b,long m)
{
long result=1;
while(b>0)
{
if(b % 2 ==1)
result=(result * a)%m;
a=(a*a)%m;
b=b/2;
}
return result;
}
}
你没有在你的班级中实现doubleValue()
方法。而且您还需要使用其他名称重命名主类,Big Integer是一个单独的对象。
两个问题:第一个关于错误使用BigInteger类的问题。
你声明了自己的BigInteger类,对不起来没有多大意义。如果您希望能够使用任意大小的整数值;使用现有的java.math.BigInteger类。
从那里:
BigInteger result=new BigInteger(Math.pow(2894135,3787313) % 4028033);
您不是使用BigInteger对象进行计算。
您正在使用int文字来计算值;以及您打算用作创建单个BigInteger的ctor参数的结果。
你可以去:
BigInteger op1 = new BigInteger(2894135)
BigInteger op2 = new BigInteger(3787313);
BigInteger op3 = new BigInteger(4028033);
BigInteger result = op1.modpow(op2, op3);
代替。取决于您打算使用的数字;您可能会或可能不会像以前那样进行“战俘”计算;使用Math.pow()并处理双重文字。但是上述内容适用于适合JVM的任何数字。
为什么你甚至想创建一个BigInteger类。
BigInteger已经在Java中定义,使用它
https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html
此外,在BigInteger上执行所有操作,而不是在最后将它们转换为BigInteger。
但