Násobné poradie
V teórii čísel je dané celé číslo A a kladné celé číslo N s gcd(AN) = 1, multiplikatívne poradie modulu N je najmenšie kladné celé číslo k s A^k(mod N) = 1. ( 0 < K < N )
Príklady:
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
Ak sa pozrieme bližšie, zistíme, že nemusíme zakaždým počítať výkon. môžeme získať ďalší výkon vynásobením „A“ predchádzajúcim výsledkom modulu.
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
Spustite slučku od 1 do N-1 a vráťte najmenší kladný výkon A pod modulo n, ktorý sa rovná 1.
Nižšie je uvedená implementácia vyššie uvedenej myšlienky.
C++ // 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 ) ; } // Function 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 raised to // the power N-1 unsigned int result = 1 ; int K = 1 ; while ( K < N ) { // modular arithmetic result = ( result * A ) % N ; // return smallest +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 raised to // the power N-1 int result = 1 ; int K = 1 ; while ( K < N ) { // modular arithmetic result = ( result * A ) % N ; // return smallest +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 # function for GCD def GCD ( a b ) : if ( b == 0 ) : return a return GCD ( b a % b ) # Function 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 raised # to the power N-1 result = 1 K = 1 while ( K < N ) : # modular arithmetic result = ( result * A ) % N # return smallest + 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 // raised to the power N-1 int result = 1 ; int K = 1 ; while ( K < N ) { // modular arithmetic result = ( result * A ) % N ; // return smallest +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 // PHP program to implement // multiplicative order // function for GCD function GCD ( $a $b ) { if ( $b == 0 ) return $a ; return GCD ( $b $a % $b ) ; } // Function return smallest // +ve integer that holds // condition A^k(mod N ) = 1 function multiplicativeOrder ( $A $N ) { if ( GCD ( $A $N ) != 1 ) return - 1 ; // result store power of A // that raised to the power N-1 $result = 1 ; $K = 1 ; while ( $K < $N ) { // modular arithmetic $result = ( $result * $A ) % $N ; // return smallest +ve integer if ( $result == 1 ) return $K ; // increment power $K ++ ; } return - 1 ; } // Driver Code $A = 4 ; $N = 7 ; echo ( multiplicativeOrder ( $A $N )); // This code is contributed by Ajit. ?>
JavaScript < script > // JavaScript program to implement // multiplicative order // function for GCD function GCD ( a b ) { if ( b == 0 ) return a ; return GCD ( b a % b ); } // Function return smallest +ve integer that // holds condition A^k(mod N ) = 1 function multiplicativeOrder ( A N ) { if ( GCD ( A N ) != 1 ) return - 1 ; // result store power of A that raised to // the power N-1 let result = 1 ; let K = 1 ; while ( K < N ) { // modular arithmetic result = ( result * A ) % N ; // return smallest +ve integer if ( result == 1 ) return K ; // increment power K ++ ; } return - 1 ; } // Driver Code let A = 4 N = 7 ; document . write ( multiplicativeOrder ( A N )); // This code is contributed by chinmoy1997pal. < /script>
výstup:
3
Časová zložitosť: O(N)
Priestorová zložitosť: O(1)
Referencia: https://en.wikipedia.org/wiki/Multiplicative_order