我对Bigintegers的简单计算不起作用

时间:2017-04-25 10:56:38

标签: java biginteger

我需要计算一下: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不是抽象的   并且不会覆盖Number public中的抽象方法doubleValue()   class BigInteger extends Number implements Comparable          ^ /tmp/java_Wcf144/BigInteger.java:24:错误:类BigInteger中的构造函数BigInteger无法应用于给定类型;
  BigInteger结果= new BigInteger(Math.pow(2894135,3787313)%4028033);                       ^ required:找不到参数:double reason:实际和形式参数列表长度不同2错误

4 个答案:

答案 0 :(得分:5)

即使在解决错误后你也会得到错误的答案,因为Math.pow(2894135,3787313),这会导致overflow中的double,并且它会返回双倍Double.MAX_VALUE的最大可能值。< / p>

因此,您需要在将其转换为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;
    }
}

答案 1 :(得分:3)

您的课程中尚未实施doubleValue()方法。 而且您还需要使用其他名称重命名主类,Big Integer是一个单独的对象。

答案 2 :(得分:2)

两个问题:第一个关于错误使用BigInteger类的问题。

你宣布了你的拥有 BigInteger类,对不起来没有多大意义。如果您希望能够使用任意大小的整数值;使用现有 java.math.BigInteger类。

从那里:

BigInteger result=new BigInteger(Math.pow(2894135,3787313) % 4028033);

使用 BigInteger对象计算

您正在使用int literals来计算值;以及您打算用作创建单个BigInteger的ctor参数的结果。

你可以去:

BigInteger op1 = new BigInteger(2894135)
BigInteger op2 = new BigInteger(3787313);
BigInteger op3 = new BigInteger(4028033);
BigInteger result = op1.modpow(op2, op3); 

代替。取决于您打算使用的数字;你可能会或者可能不会做&#34; pow&#34;像以前一样计算;使用Math.pow()并使用 double 文字。但上述内容适用于适合JVM的任何数字。

答案 3 :(得分:1)

为什么你甚至想创建一个BigInteger类。

BigInteger已经在Java中定义,使用它

https://docs.oracle.com/javase/7/docs/api/java/math/BigInteger.html

此外,在BigInteger上执行所有操作,而不是在最后将它们转换为BigInteger。

ABHI