Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我用大整数进行的简单计算不起作用_Java_Biginteger - Fatal编程技术网

Java 我用大整数进行的简单计算不起作用

Java 我用大整数进行的简单计算不起作用,java,biginteger,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) {

我需要计算一下: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);
  }
}
import java.lang.Math;
导入java.util.Scanner;
公共类BigInteger扩展了数字实现
{
公共静态void main(字符串[]args)
{
BigInteger结果=新的BigInteger(Math.pow(28941353787313)%4028033);
系统输出打印项次(结果);
}
}
错误:

/tmp/java_Wcf144/biginger.java:19:error:biginger不是抽象的 并且不重写public Number中的抽象方法doubleValue() 类BigInteger扩展了数字实现 ^/tmp/java_Wcf144/biginger.java:24:error:biginger类中的构造函数biginger不能应用于给定类型
BigInteger结果=新的BigInteger(Math.pow(28941353787313)%4028033); ^必需:未找到参数:双重原因:实际参数列表和正式参数列表长度不同2个错误


您尚未在类中实现
doubleValue()
方法。
您还需要使用其他名称重命名主类,大整数是一个单独的对象。

为什么要创建一个大整数类

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

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


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

您声明了自己的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); 

相反。取决于您打算使用的数字;你可能会也可能不会像以前那样进行“pow”计算;使用Math.pow()并处理double文本。但上述方法适用于任何适合JVM的
数字。

即使解决了错误,您也会得到错误的答案,因为
Math.pow(28941353787313)
,这将导致
double
中的
溢出
,并返回double
double.MAX_值的最大可能值

因此,您需要在将它们转换为
biginger
后执行所有操作

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);
  }
}
编辑: 如果您想以更优化的方式执行此操作,则可以使用的概念。这将以
O(对数(指数))
的复杂度给出输出。这里不能使用更大的值,因为它可能导致
long
中的
溢出
,最终导致错误的结果

代码:


将您的类重命名为除
biginger
以外的其他类。除此之外,您正在尝试首先执行所有算术运算,然后将结果转换为
biginger
。那是行不通的。您应该在
biginger
中完成所有算术运算。是的,正如Reimeus所说,您确实不想将自己的类声明为
BigInteger
…但不要将其重命名为BigInteger(如标题中所示)。不确定您是否意识到这一点,但
2894135^3787313
确实是一个很大的数字。基本上,您无法计算该表达式。即使是
biginger
在这里也帮不上你的忙…没有机会计算吗?我的意思是wolframalpha可以做到,但我需要用3000个不同的数字来计算。我将从txt文件中读取数字,而且构造函数
BigInter(long/double)
不起作用。使用
biginger.valueOf((long)Math.pow(28941353787313))
这是真的,但这不是错误的原因。感谢您的帮助!下面来自Sanket Makani的代码解决了我所有的问题,并完成了这个庞大的计算!正如@Sushobh Nadiger所指出的,真正的初始问题是。他正在扩展
数字
类。该类有一个抽象函数
doubleValue()
,OP的类在编译之前首先需要覆盖该函数!非常感谢您的时间,我得到了正确的结果:)虽然您来得晚了一点;你需要第一个给出完全正确答案的人。我投赞成票!好吧,
biginger.modPow
也使用模幂运算。当然,对于大整数,而不是longs.Ahh@RudyVelthuis,我不知道
biginger.modPow
使用
模幂运算。谢谢你通知我。附言:虽然我在写答案的时候想到了应该使用它P
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;
    }
}