📜  乘法顺序

📅  最后修改于: 2021-04-27 22:29:22             🧑  作者: Mango

在数论中,给定整数A和gcd(A,N)= 1的正整数N,模N的乘法阶数是A ^ k(mod N)= 1的最小正整数k。 K 例子 :

Input : A = 4 , N = 7 
Output : 3
explanation :  GCD(4, 7) = 1  
               A^k( mod N ) = 1 ( smallest positive integer K )
               4^1 = 4(mod 7)  = 4
               4^2 = 16(mod 7) = 2
               4^3 = 64(mod 7)  = 1
               4^4 = 256(mod 7) = 4
               4^5 = 1024(mod 7)  = 2
               4^6 = 4096(mod 7)  = 1

smallest positive integer K = 3  

Input :  A = 3 , N = 1000 
Output : 100  (3^100 (mod 1000) == 1) 

Input : A = 4 , N = 11 
Output : 5 

如果我们仔细观察,就会发现我们不需要每次都计算功率。我们可以通过将’A’乘以模块的前一个结果来获得下一个幂。

Explanation : 
A = 4 , N = 11  
initially result = 1 
with normal                with modular arithmetic (A * result)
4^1 = 4 (mod 11 ) = 4  ||  4 * 1 = 4 (mod 11 ) = 4 [ result = 4]
4^2 = 16(mod 11 ) = 5  ||  4 * 4 = 16(mod 11 ) = 5 [ result = 5]
4^3 = 64(mod 11 ) = 9  ||  4 * 5 = 20(mod 11 ) = 9 [ result = 9]
4^4 = 256(mod 11 )= 3  ||  4 * 9 = 36(mod 11 ) = 3 [ result = 3]
4^5 = 1024(mod 5 ) = 1 ||  4 * 3 = 12(mod 11 ) = 1 [ result = 1]

smallest positive integer  5 

运行从1到N-1的循环,并在模n等于1的情况下返回A的最小+ ve幂。
以下是上述想法的实现。

CPP
// C++ program to implement multiplicative order
#include
using namespace std;
 
// function for GCD
int GCD ( int a , int b )
{
    if (b == 0 )
        return a;
    return GCD( b , a%b ) ;
}
 
// Fucnction return smallest +ve integer that
// holds condition A^k(mod N ) = 1
int multiplicativeOrder(int A, int  N)
{
    if (GCD(A, N ) != 1)
        return -1;
 
    // result store power of A that rised to
    // the power N-1
    unsigned int result = 1;
 
    int K = 1 ;
    while (K < N)
    {
        // modular arithmetic
        result = (result * A) % N ;
 
        // return samllest +ve integer
        if (result  == 1)
            return K;
 
        // increment power
        K++;
    }
 
    return -1 ;
}
 
//driver program to test above function
int main()
{
    int A = 4 , N = 7;
    cout << multiplicativeOrder(A, N);
    return 0;
}


Java
// Java program to implement multiplicative order
import java.io.*;
 
class GFG {
 
    // function for GCD
    static int GCD(int a, int b) {
         
        if (b == 0)
            return a;
             
        return GCD(b, a % b);
    }
     
    // Function return smallest +ve integer that
    // holds condition A^k(mod N ) = 1
    static int multiplicativeOrder(int A, int N) {
         
        if (GCD(A, N) != 1)
            return -1;
     
        // result store power of A that rised to
        // the power N-1
        int result = 1;
     
        int K = 1;
         
        while (K < N) {
             
            // modular arithmetic
            result = (result * A) % N;
         
            // return samllest +ve integer
            if (result == 1)
                return K;
         
            // increment power
            K++;
        }
     
        return -1;
    }
     
    // driver program to test above function
    public static void main(String args[]) {
         
        int A = 4, N = 7;
         
        System.out.println(multiplicativeOrder(A, N));
    }
}
 
/* This code is contributed by Nikita Tiwari.*/


Python3
# Python 3 program to implement
# multiplicative order
 
# funnction for GCD
def GCD (a, b ) :
    if (b == 0 ) :
        return a
    return GCD( b, a % b )
 
# Fucnction return smallest + ve
# integer that holds condition
# A ^ k(mod N ) = 1
def multiplicativeOrder(A, N) :
    if (GCD(A, N ) != 1) :
        return -1
 
    # result store power of A that rised
    # to the power N-1
    result = 1
 
    K = 1
    while (K < N) :
     
        # modular arithmetic
        result = (result * A) % N
 
        # return samllest + ve integer
        if (result == 1) :
            return K
 
        # increment power
        K = K + 1
     
    return -1
     
# Driver program
A = 4
N = 7
print(multiplicativeOrder(A, N))
 
# This code is contributed by Nikita Tiwari.


C#
// C# program to implement multiplicative order
using System;
 
class GFG {
 
    // function for GCD
    static int GCD(int a, int b)
    {
         
        if (b == 0)
            return a;
             
        return GCD(b, a % b);
    }
     
    // Function return smallest +ve integer
    // that holds condition A^k(mod N ) = 1
    static int multiplicativeOrder(int A, int N)
    {
         
        if (GCD(A, N) != 1)
            return -1;
     
        // result store power of A that
        // rised to the power N-1
        int result = 1;
     
        int K = 1;
         
        while (K < N)
        {
             
            // modular arithmetic
            result = (result * A) % N;
         
            // return samllest +ve integer
            if (result == 1)
                return K;
         
            // increment power
            K++;
        }
     
        return -1;
    }
     
    // Driver Code
    public static void Main()
    {
         
        int A = 4, N = 7;
         
        Console.Write(multiplicativeOrder(A, N));
    }
}
 
// This code is contributed by Nitin Mittal.


PHP


Javascript


输出 :

3