快速幂取模算法java
时间: 2023-11-25 16:48:51 浏览: 184
快速幂取模算法是一种用于计算幂取模的高效算法,它可以在O(logn)的时间复杂度内完成计算。在Java中,可以使用以下代码实现快速幂取模算法:
```java
public static int fastPowMod(int a, int b, int c) {
int ans = 1;
a %= c;
while (b > 0) {
if ((b & 1) == 1) {
ans = (ans * a) % c;
}
b >>= 1;
a = (a * a) % c;
}
return ans;
}
```
其中,a、b、c分别为底数、指数和模数,返回值为a^b mod c的结果。该算法的基本思想是将指数b转化为二进制形式,然后根据二进制位上的值来计算幂的乘积,最终得到结果。
相关问题
java 快速幂取模
Java中的快速幂取模是一种计算幂取模的算法,它可以在不使用大量乘法的情况下快速计算出幂取模的结果。这种算法使用二进制分解来计算幂,将幂分解为2的幂次方的和,然后使用模运算来计算每个2的幂次方的结果,最后将这些结果相乘得到最终结果。Java中的快速幂取模可以用于计算大数的幂取模、最大公约数、乘法逆元、素数判定以及大素数的生成等问题。
快速幂取模的实现需要用到以下两个公式:
1. a^b mod c = (a mod c)^b mod c
2. a^(2n) mod c = (a^n mod c)^2 mod c
Java中的快速幂取模的实现可以参考以下代码:
```
/**
* 快速幂取模
* @param one 底数
* @param two 指数
* @param mod 模
* @return 结果
*/
public static String Power(String one,String two,String mod) {
if(two.equals("0")) { //0次幂结果为1
return "1";
}else if(two.equals("1")){ //1次幂结果为它本身
return Mod(one, mod);
}
String count=two,result="1",temp=one;
while(!count.equals("0")){
if(Mod(count, "2").equals("1")) //看它二进制最后一位是不是1
result=Multiply(result, temp, mod);
if(!count.equals("1")) //这里避免最后一次做没用的乘法
temp=Multiply(temp, temp, mod);
count=Division(count, "2"); //次数减1,相当于二进制右移一位
}
return result;
}
```
平方乘算法java实现详细解析
平方乘算法是一种快速计算大数幂的算法,它的基本思想是利用指数的二进制分解和平方运算的性质,将指数的幂运算转化为若干个平方运算和乘法运算的组合,从而减少计算量。下面是平方乘算法的Java实现详细解析:
1.首先定义一个方法来实现平方乘算法,该方法接受三个参数:底数base、指数exponent和模数modulus,返回计算结果result。其中,底数、指数和模数都是大数,使用Java的BigInteger类来表示。
```java
public static BigInteger squareAndMultiply(BigInteger base, BigInteger exponent, BigInteger modulus) {
// TODO: 实现平方乘算法
return result;
}
```
2.将指数exponent转化为二进制形式,并保存在一个数组中。代码如下:
```java
String binaryExponent = exponent.toString(2);
int[] binaryArray = new int[binaryExponent.length()];
for (int i = 0; i < binaryExponent.length(); i++) {
binaryArray[i] = Integer.parseInt(String.valueOf(binaryExponent.charAt(i)));
}
```
3.初始化结果result为1,接着开始循环计算。
4.从数组的最高位开始,判断该位的值是否为1,如果为1,则将结果result乘以底数base,并对结果取模。
```java
if (binaryArray[i] == 1) {
result = result.multiply(base).mod(modulus);
}
```
5.将底数base平方,并对结果取模,以便在下一次循环中使用。
```java
base = base.multiply(base).mod(modulus);
```
6.循环结束后,返回最终的计算结果result。
完整的平方乘算法Java实现代码如下:
```java
public static BigInteger squareAndMultiply(BigInteger base, BigInteger exponent, BigInteger modulus) {
String binaryExponent = exponent.toString(2);
int[] binaryArray = new int[binaryExponent.length()];
for (int i = 0; i < binaryExponent.length(); i++) {
binaryArray[i] = Integer.parseInt(String.valueOf(binaryExponent.charAt(i)));
}
BigInteger result = BigInteger.ONE;
for (int i = binaryArray.length - 1; i >= 0; i--) {
if (binaryArray[i] == 1) {
result = result.multiply(base).mod(modulus);
}
base = base.multiply(base).mod(modulus);
}
return result;
}
```
使用该方法可以快速计算大数幂,例如计算2的100次方对10007取模的结果:
```java
BigInteger base = BigInteger.valueOf(2);
BigInteger exponent = BigInteger.valueOf(100);
BigInteger modulus = BigInteger.valueOf(10007);
BigInteger result = squareAndMultiply(base, exponent, modulus);
System.out.println(result); // 输出:5879
```
阅读全文