本文概述
- C ++
- C
- Java
- Python3
- C#
- 的PHP
例子 :
Input:x = 2, y = 3, p = 5
Output: 3
Explanation: 2^3 % 5 = 8 % 5 = 3.Input:x = 2, y = 5, p = 13
Output: 6
Explanation: 2^5 % 13 = 32 % 13 = 6.
我们已经讨论过递归的和反复的电力解决方案。
下面讨论迭代解决方案。
/* Iterative Function to calculate (x^y) in O(log y) */
int power( int x, unsigned int y)
{
int res = 1;
//Initialize resultwhile (y>
0)
{
//If y is odd, multiply x with result
if (y &
1)
res = res*x;
//y must be even now
y = y>
>
1;
//y = y/2
x = x*x;
//Change x to x^2
}
return res;
}
上述解决方案的问题是, 对于较大的n或x值可能会发生溢出。因此, 通常以大数为模来评估功率。
下面是基本的模块化属性, 用于在模块化算术下有效地计算功率。
(ab) mod p = ( (a mod p) (b mod p) ) mod p For example a = 50, b = 100, p = 13
50mod 13= 11
100 mod 13= 9(50 * 100) mod 13 = ( (50 mod 13) * (100 mod 13) ) mod 13
or (5000) mod 13 = ( 11 * 9 ) mod 13
or 8 = 8
下面是基于上述属性的实现。
C ++
//Iterative C++ program to compute modular power
#include <
iostream>
using namespace std;
/* Iterative Function to calculate (x^y)%p in O(log y) */
int power( int x, unsigned int y, int p)
{
int res = 1;
//Initialize result x = x % p;
//Update x if it is more than or
//equal to pif (x == 0) return 0;
//In case x is divisible by p;
while (y>
0)
{
//If y is odd, multiply x with result
if (y &
1)
res = (res*x) % p;
//y must be even now
y = y>
>
1;
//y = y/2
x = (x*x) % p;
}
return res;
} //Driver code
int main()
{
int x = 2;
int y = 5;
int p = 13;
cout <
<
"Power is " <
<
power(x, y, p);
return 0;
} //This code is contributed by shubhamsingh10
C
//Iterative C program to compute modular power
#include <
stdio.h>
/* Iterative Function to calculate (x^y)%p in O(log y) */
int power( int x, unsigned int y, int p)
{
int res = 1;
//Initialize resultx = x % p;
//Update x if it is more than or
//equal to pif (x == 0) return 0;
//In case x is divisible by p;
while (y>
0)
{
//If y is odd, multiply x with result
if (y &
1)
res = (res*x) % p;
//y must be even now
y = y>
>
1;
//y = y/2
x = (x*x) % p;
}
return res;
}//Driver program to test above functions
int main()
{
int x = 2;
int y = 5;
int p = 13;
printf ( "Power is %u" , power(x, y, p));
return 0;
}
Java
//Iterative Java program to
//compute modular power
import java.io.*;
class GFG {/* Iterative Function to calculate
(x^y)%p in O(log y) */
static int power( int x, int y, int p)
{
//Initialize result
int res = 1 ;
//Update x if it is more
//than or equal to p
x = x % p;
if (x == 0 ) return 0 ;
//In case x is divisible by p;
while (y>
0 )
{
//If y is odd, multiply x
//with result
if ((y &
1 )== 1 )
res = (res * x) % p;
//y must be even now
//y = y /2
y = y>
>
1 ;
x = (x * x) % p;
}
return res;
}//Driver Program to test above functions
public static void main(String args[])
{
int x = 2 ;
int y = 5 ;
int p = 13 ;
System.out.println( "Power is " + power(x, y, p));
}
}//This code is contributed by Nikita Tiwari.
Python3
# Iterative Python3 program
# to compute modular power# Iterative Function to calculate
# (x^y)%p in O(log y)
def power(x, y, p) :
res = 1# Initialize result# Update x if it is more
# than or equal to p
x = x % p if (x = = 0 ) :
return 0while (y>
0 ) :# If y is odd, multiply
# x with result
if ((y &
1 ) = = 1 ) :
res = (res * x) % p# y must be even now
y = y>
>
1# y = y/2
x = (x * x) % preturn res# Driver Codex = 2 ;
y = 5 ;
p = 13
print ( "Power is " , power(x, y, p))# This code is contributed by Nikita Tiwari.
C#
//Iterative C# program to
//compute modular power
class GFG
{/* Iterative Function to calculate
(x^y)%p in O(log y) */
static int power( int x, int y, int p)
{
//Initialize result
int res = 1;
//Update x if it is more
//than or equal to p
x = x % p;
if (x == 0)
return 0;
while (y>
0)
{
//If y is odd, multiply
//x with result
if ((y &
1) == 1)
res = (res * x) % p;
//y must be even now
//y = y /2
y = y>
>
1;
x = (x * x) % p;
}
return res;
}//Driver Code
public static void Main()
{
int x = 2;
int y = 5;
int p = 13;
System.Console.WriteLine( "Power is " +
power(x, y, p));
}
}//This code is contributed by mits
的PHP
<
?php
//Iterative PHP program to
//compute modular power//Iterative Function to
//calculate (x^y)%p in O(log y)
function power( $x , $y , $p )
{
//Initialize result
$res = 1;
//Update x if it is more
//than or equal to p
$x = $x % $p ;
if ( $x == 0)
return 0;
while ( $y>
0)
{
//If y is odd, multiply
//x with result
if ( $y &
1)
$res = ( $res * $x ) % $p ;
//y must be even now//y = $y/2
$y = $y>
>
1;
$x = ( $x * $x ) % $p ;
}
return $res ;
}//Driver Code
$x = 2;
$y = 5;
$p = 13;
echo "Power is " , power( $x , $y , $p );
//This code is contributed by aj_36
?>
输出:
Power is 6
上述解决方案的时间复杂度为O(Log y)。
模幂(递归)
【模幂(模运算中的幂)】本文作者:西瓦姆·阿格罗瓦尔。如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
推荐阅读
- 算法设计(模划分详细实现)
- 算法设计(从1到n的模乘逆)
- 循环冗余校验和Modulo-2分区
- 算法题(模数10 ^ 9 + 7(1000000007))
- 自学一年C#(WPF),第二年自学Android。登录
- Android性能优化系列之渲染优化
- android studio 学习之一
- Android中使用findViewByMe提升组件查找效率
- Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined