📜  模幂(递归)

📅  最后修改于: 2021-04-28 17:53:39             🧑  作者: Mango

给定三个数字a,b和c,我们需要找到(a b )%c
现在为什么在求幂后执行“%c”,因为即使对于相对较小的a,b值, b也会非常大,这是一个问题,因为我们尝试对问题进行编码的语言的数据类型很可能不会让我们存储这么大的数量。
例子:

Input : a = 2312 b = 3434 c = 6789
Output : 6343

Input : a = -3 b = 5 c = 89 
Output : 24

该想法基于以下属性。
属性1:
(m * n)%p具有一个非常有趣的属性:
(m * n)%p =(((m%p)*(n%p))%p
属性2:
如果b是偶数:
(a ^ b)%c =((a ^ b / 2)*(a ^ b / 2))%c?这表明分而治之
如果b是奇数:
(a ^ b)%c =(a *(a ^(b-1))%c
属性3:
如果必须返回绝对值小于y的负数x的mod:
然后(x + y)%y就可以了
笔记:
另外,由于(a ^ b / 2)*(a ^ b / 2)和a *(a ^(b-1)的乘积可能会导致溢出,因此我们必须注意那些情况

C++
// Recursive C++ program to compute modular power
#include 
using namespace std;
 
int exponentMod(int A, int B, int C)
{
    // Base cases
    if (A == 0)
        return 0;
    if (B == 0)
        return 1;
 
    // If B is even
    long y;
    if (B % 2 == 0) {
        y = exponentMod(A, B / 2, C);
        y = (y * y) % C;
    }
 
    // If B is odd
    else {
        y = A % C;
        y = (y * exponentMod(A, B - 1, C) % C) % C;
    }
 
    return (int)((y + C) % C);
}
 
// Driver code
int main()
{
    int A = 2, B = 5, C = 13;
    cout << "Power is " << exponentMod(A, B, C);
    return 0;
}
 
// This code is contributed by SHUBHAMSINGH10


C
// Recursive C program to compute modular power
#include 
 
int exponentMod(int A, int B, int C)
{
    // Base cases
    if (A == 0)
        return 0;
    if (B == 0)
        return 1;
 
    // If B is even
    long y;
    if (B % 2 == 0) {
        y = exponentMod(A, B / 2, C);
        y = (y * y) % C;
    }
 
    // If B is odd
    else {
        y = A % C;
        y = (y * exponentMod(A, B - 1, C) % C) % C;
    }
 
    return (int)((y + C) % C);
}
 
// Driver program to test above functions
int main()
{
   int A = 2, B = 5, C = 13;
   printf("Power is %d", exponentMod(A, B, C));
   return 0;
}


Java
// Recursive Java program
// to compute modular power
import java.io.*;
 
class GFG
{
static int exponentMod(int A,
                       int B, int C)
{
         
    // Base cases
    if (A == 0)
        return 0;
    if (B == 0)
        return 1;
     
    // If B is even
    long y;
    if (B % 2 == 0)
    {
        y = exponentMod(A, B / 2, C);
        y = (y * y) % C;
    }
     
    // If B is odd
    else
    {
        y = A % C;
        y = (y * exponentMod(A, B - 1,
                             C) % C) % C;
    }
     
    return (int)((y + C) % C);
}
 
// Driver Code
public static void main(String args[])
{
    int A = 2, B = 5, C = 13;
    System.out.println("Power is " +
                        exponentMod(A, B, C));
}
}
 
// This code is contributed
// by Swetank Modi.


Python3
# Recursive Python program
# to compute modular power
def exponentMod(A, B, C):
     
    # Base Cases
    if (A == 0):
        return 0
    if (B == 0):
        return 1
     
    # If B is Even
    y = 0
    if (B % 2 == 0):
        y = exponentMod(A, B / 2, C)
        y = (y * y) % C
     
    # If B is Odd
    else:
        y = A % C
        y = (y * exponentMod(A, B - 1,
                             C) % C) % C
    return ((y + C) % C)
 
# Driver Code
A = 2
B = 5
C = 13
print("Power is", exponentMod(A, B, C))
     
# This code is contributed
# by Swetank Modi.


C#
// Recursive C# program
// to compute modular power
class GFG
{
static int exponentMod(int A, int B, int C)
{
         
    // Base cases
    if (A == 0)
        return 0;
    if (B == 0)
        return 1;
     
    // If B is even
    long y;
    if (B % 2 == 0)
    {
        y = exponentMod(A, B / 2, C);
        y = (y * y) % C;
    }
     
    // If B is odd
    else
    {
        y = A % C;
        y = (y * exponentMod(A, B - 1,
                             C) % C) % C;
    }
     
    return (int)((y + C) % C);
}
 
// Driver Code
public static void Main()
{
    int A = 2, B = 5, C = 13;
    System.Console.WriteLine("Power is " +
                    exponentMod(A, B, C));
}
}
 
// This code is contributed
// by mits


PHP


Javascript


输出:
Power is 6

迭代模幂。