我正在尝试使用Java解决这个问题,但似乎无法弄清楚我的代码有什么问题。
5 ^ 30000和6 ^ 123456的差异是31的倍数?
public class fermat {
public static int fermat(int x, int y, int n){
return (int)(Math.pow(x,y)%n);
}
public static void main(String[] args) {
int result1=fermat(5,30000,31);
int result2=fermat(6,123456,31);
System.out.println(result1);
System.out.println(result2);
} // main
} // class Fermat
返回0.
答案 0 :(得分:1)
您是否注意到5 ^ 30000大致等于
1.25930254358409145729153078521520405922516958025249... × 10^20969
??
这些输入显然会出现一些溢出问题。
对于具有模数的大功率,您可以使用基于这些规则的模幂运算方法:
c mod m = (a ⋅ b) mod m
c mod m = [(a mod m) ⋅ (b mod m)] mod m
从wikipedia开始,这是伪代码:
function modular_pow(base, exponent, modulus)
if modulus = 1 then return 0
c := 1
for e_prime = 1 to exponent
c := (c * base) mod modulus
return c
答案 1 :(得分:1)
我解决了自己的问题。问题是我使用的是int并且必须使用BigInteger。
这是我的解决方案。
import java.math.*;
import java.util.*;
public class fermat {
public static BigInteger fermat(BigInteger x, BigInteger y, BigInteger n){
return (x.modPow(y,n));
}
public static void main(String[] argv)
{
BigInteger a=new BigInteger("5");
BigInteger b=new BigInteger("30000");
BigInteger c=new BigInteger("31");
BigInteger d=new BigInteger("6");
BigInteger e=new BigInteger("123456");
BigInteger f=new BigInteger("31");
BigInteger result1=fermat(a,b,c);
System.out.println(result1);
BigInteger result2=fermat(d,e,f);
System.out.println(result2);
}
}//end of class