Java 绕过Integer.toString()处理BigInteger

Java 绕过Integer.toString()处理BigInteger,java,biginteger,Java,Biginteger,我想得到一个数的四次幂的余数。这是我的密码: static int testMod(int a, int mod) { /* //This looks clear BigInteger a4 = a; return (a4.pow(4))%mod; */ //This works String a2String = Integer.toString(a); String mod2String = Integer.toString(mod);

我想得到一个数的四次幂的余数。这是我的密码:

static int testMod(int a, int mod) {

/*  //This looks clear
    BigInteger a4 = a;    
    return (a4.pow(4))%mod;
*/

    //This works
    String a2String = Integer.toString(a);
    String mod2String = Integer.toString(mod);
    BigInteger a4 = new BigInteger(a2String);
    BigInteger modBigInt = new BigInteger(mod2String);
    a4 = a4.pow(4);

    return a4.remainder(modBigInt).intValue();
}

它工作正常,但转换为字符串似乎是不必要的,使用
%
操作符比
a.resident(b)
更简洁。是否可以将其重写以使其更清晰?

我不知道这是否更好,但它消除了对
字符串的不必要转换,并返回:

static int testMod(int a, int mod)
{
    BigInteger a4 = BigInteger.valueOf(a).pow(4);

    return a4.remainder(BigInteger.valueOf(mod)).intValue();
}

通过使用
biginger.valueOf(long)
int
s转换为
biginger
,您可以通过
String
摆脱转换。但是,不能将
%
运算符应用于
biginger
操作数。如果可以,则
biginger.rem余数()
将不存在。另一方面,正如@LouisWasserman所观察到的,有
biginger.modPow()
在一次调用中执行求幂和余数

此外,
biginger
支持方法链接,正如您所认识的那样。如果你愿意的话,你可以在一个语句中完成整个过程,但我认为这是简洁性和可读性之间的一个很好的折衷:

static int testMod(int a, int mod) {
    BigInteger bigA = BigInteger.valueOf(a);
    BigInteger bigMod = BigInteger.valueOf(mod);

    return bigA.modPow(BigInteger.valueOf(4), bigMod).intValue();
}

虽然还没有提出,但您也可以考虑使用
import static
来减轻代码的负担,也可以使用
biginger#mod
方法代替
#余数

import java.math.BigInteger;
import static java.math.BigInteger.valueOf;


public class BigInt {
    public static void main(String[] args) {
        System.out.println(testMod(5,36)); // 13
        System.out.println(testMod(250, 999)); // 160
    }

    public static int testMod(int a, int mod) {
        return valueOf(a).pow(4).mod(valueOf(mod)).intValue();
    }
}

应为“四次方”或“四次方”。由于a4可能大于一个长整数,如果将a4转换为整数以执行模运算,则可能会失去精度并返回错误答案。为什么不使用
biginger.modPow
?@LouisWasserman,确实是为什么?我没有好的回应。嗯。我想你实际上可能不得不做
bigA.modPow(biginger.valueOf(4),bigMod)
,这很可惜,但我怀疑还是值得的。@LouisWasserman,是的,你是对的。虽然没有那么漂亮,但是一个
modPow()
比链接
pow()
rements()
要好得多。FWIW:事实上,
rements()
可能仍然存在,即使存在操作符重载。我的(Delphi)BigInteger实现具有运算符重载和完整函数名。