Trouvez (a^b)%m où 'a' est très grand

Trouvez (a^b)%m où 'a' est très grand
Essayez-le sur GfG Practice #practiceLinkDiv { display : aucun !important; }

Étant donné trois nombres un b et m 1 <=bm <=10^6 et 'un' peut être très volumineux et contenir jusqu'à 10^6 chiffres. La tâche est de trouver (a^b)%m .

Exemples : 

  Input :   a = 3 b = 2 m = 4   Output :   1   Explanation :   (3^2)%4 = 9%4 = 1   Input :   a = 987584345091051645734583954832576 b = 3 m = 11   Output:   10 
Recommended Practice Trouver (a^b)%m Essayez-le !

Ce problème est essentiellement basé sur l’arithmétique modulaire. Nous pouvons écrire (a^b) %m comme (a%m) * (a%m) * (a%m) * ... (a%m) b fois . Ci-dessous un algorithme pour résoudre ce problème : 

  • Puisque « a » est très grand, lisez donc « a » sous forme de chaîne.
  • Maintenant, nous essayons de réduire « a ». Nous prenons le modulo de « a » par m une fois, c'est-à-dire ; ans = a % m de cette façon maintenant ans=a%m se situe entre une plage entière de 1 à 10 ^ 6, c'est-à-dire ; 1 <= a%m <= 10^6.
  • Maintenant, multipliez ans par b-1 fois et prendre simultanément le mod du résultat de multiplication intermédiaire avec m car la multiplication intermédiaire de ans peut dépasser la plage des nombres entiers et cela produira une mauvaise réponse.
C++
   // C++ program to find (a^b) mod m for a large 'a'   #include       using     namespace     std  ;   // utility function to calculate a%m   unsigned     int     aModM  (  string     s       unsigned     int     mod  )   {      unsigned     int     number     =     0  ;      for     (  unsigned     int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )      {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number  *  10     +     (  s  [  i  ]     -     '0'  ));      number     %=     mod  ;      }      return     number  ;   }   // Returns find (a^b) % m   unsigned     int     ApowBmodM  (  string     &  a       unsigned     int     b        unsigned     int     m  )   {      // Find a%m      unsigned     int     ans     =     aModM  (  a       m  );      unsigned     int     mul     =     ans  ;      // now multiply ans by b-1 times and take      // mod with m      for     (  unsigned     int     i  =  1  ;     i   <  b  ;     i  ++  )      ans     =     (  ans  *  mul  )     %     m  ;      return     ans  ;   }   // Driver program to run the case   int     main  ()   {      string     a     =     '987584345091051645734583954832576'  ;      unsigned     int     b  =  3       m  =  11  ;      cout      < <     ApowBmodM  (  a       b       m  );      return     0  ;   }   
Java
   // Java program to find (a^b) mod m for a large 'a'   public     class   GFG     {          // utility function to calculate a%m      static     int     aModM  (  String     s       int     mod  )      {      int     number     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )      {          // (s[i]-'0') gives the digit      // value and form the number      number     =     (  number     *     10     );      int     x     =     Character  .  getNumericValue  (  s  .  charAt  (  i  ));      number     =     number     +     x  ;      number     %=     mod  ;      }          return     number  ;      }      // Returns find (a^b) % m      static     int     ApowBmodM  (  String     a       int     b       int     m  )      {          // Find a%m      int     ans     =     aModM  (  a       m  );      int     mul     =     ans  ;          // now multiply ans by b-1 times       // and take mod with m      for     (  int     i     =     1  ;     i      <     b  ;     i  ++  )      ans     =     (  ans     *     mul  )     %     m  ;          return     ans  ;      }      // Driver code      public     static     void     main  (  String     args  []  )      {      String     a     =     '987584345091051645734583954832576'  ;      int     b     =     3       m     =     11  ;      System  .  out  .  println  (  ApowBmodM  (  a       b       m  ));      }   }   // This code is contributed by Sam007   
Python3
   # Python program to find (a^b) mod m for a large 'a'   def   aModM  (  s     mod  ):   number   =   0   # convert string s[i] to integer which gives   # the digit value and form the number   for   i   in   range  (  len  (  s  )):   number   =   (  number  *  10   +   int  (  s  [  i  ]))   number   =   number   %   m   return   number   # Returns find (a^b) % m   def   ApowBmodM  (  a     b     m  ):   # Find a%m    ans   =   aModM  (  a     m  )   mul   =   ans   # now multiply ans by b-1 times and take   # mod with m   for   i   in   range  (  1    b  ):   ans   =   (  ans  *  mul  )   %   m   return   ans   # Driver program to run the case   a   =   '987584345091051645734583954832576'   b     m   =   3     11   print   (  ApowBmodM  (  a     b     m  ))   
C#
      // C# program to find (a^b) mod m   // for a large 'a'   using     System  ;   class     GFG     {       // utility function to calculate a%m   static     int     aModM  (  string     s       int     mod  )   {      int     number     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  Length  ;     i  ++  )      {          // (s[i]-'0') gives the digit      // value and form the number      number     =     (  number     *     10     );      int     x     =     (  int  )(  s  [  i  ]     -     '0'  );      number     =     number     +     x  ;      number     %=     mod  ;      }      return     number  ;   }   // Returns find (a^b) % m   static     int     ApowBmodM  (  string     a       int     b           int     m  )   {          // Find a%m      int     ans     =     aModM  (  a       m  );      int     mul     =     ans  ;      // now multiply ans by b-1 times       // and take mod with m      for     (  int     i     =     1  ;     i      <     b  ;     i  ++  )      ans     =     (  ans     *     mul  )     %     m  ;      return     ans  ;   }   // Driver Code   public     static     void     Main  ()   {      string     a     =     '987584345091051645734583954832576'  ;      int     b  =  3       m  =  11  ;      Console  .  Write  (  ApowBmodM  (  a       b       m  ));       }   }   // This code is contributed by Sam007       
PHP
      // PHP program to find (a^b)   // mod m for a large 'a'   // utility function to    // calculate a%m   function   aModM  (  $s     $mod  )   {   $number   =   0  ;   for   (  $i   =   0  ;   $i    <   strlen  (  $s  );   $i  ++  )   {   // (s[i]-'0') gives the digit   // value and form the number   $number   =   (  $number   *   10   +   (  $s  [  $i  ]   -   '0'  ));   $number   %=   $mod  ;   }   return   $number  ;   }   // Returns find (a^b) % m   function   ApowBmodM  (  $a     $b    $m  )   {   // Find a%m   $ans   =   aModM  (  $a     $m  );   $mul   =   $ans  ;   // now multiply ans by    // b-1 times and take   // mod with m   for   (  $i   =   1  ;   $i    <   $b  ;   $i  ++  )   $ans   =   (  $ans   *   $mul  )   %   $m  ;   return   $ans  ;   }   // Driver code   $a   =   '987584345091051645734583954832576'  ;   $b   =   3  ;   $m   =   11  ;   echo   ApowBmodM  (  $a     $b     $m  );   return   0  ;   // This code is contributed by nitin mittal.   ?>   
JavaScript
    <  script  >   // JavaScript program to find (a^b) mod m   // for a large 'a'   // Utility function to calculate a%m   function     aModM  (  s       mod  )   {      let     number     =     0  ;      for  (  let     i     =     0  ;     i      <     s  .  length  ;     i  ++  )      {          // (s[i]-'0') gives the digit      // value and form the number      number     =     (  number     *     10     );      let     x     =     (  s  [  i  ]     -     '0'  );      number     =     number     +     x  ;      number     %=     mod  ;      }      return     number  ;   }       // Returns find (a^b) % m   function     ApowBmodM  (  a       b       m  )   {          // Find a%m      let     ans     =     aModM  (  a       m  );      let     mul     =     ans  ;          // Now multiply ans by b-1 times       // and take mod with m      for  (  let     i     =     1  ;     i      <     b  ;     i  ++  )      ans     =     (  ans     *     mul  )     %     m  ;          return     ans  ;   }       // Driver Code   let     a     =     '987584345091051645734583954832576'  ;   let     b     =     3       m     =     11  ;   document  .  write  (  ApowBmodM  (  a       b       m  ));   // This code is contributed by souravghosh0416    <  /script>   

Sortir
10 

Complexité temporelle : O(seulement(a)+b)

Espace auxiliaire : O(1)

Approche efficace : Les multiplications ci-dessus peuvent être réduites à journal b en utilisant exponentiation modulaire rapide où nous calculons le résultat par la représentation binaire de l'exposant (b) . Si le bit défini est 1 nous multiplions la valeur actuelle de la base par le résultat et mettons au carré la valeur de la base pour chaque appel récursif.

Code récursif :

C++14
   // C++ program to find (a^b) mod m for a large 'a' with an   // efficient approach.   #include          using     namespace     std  ;   typedef     long     long     ll  ;   // Reduce the number B to a small number   // using Fermat Little   ll     MOD  (  string     num       int     mod  )   {      ll     res     =     0  ;      for     (  int     i     =     0  ;     i      <     num  .  length  ();     i  ++  )      res     =     (  res     *     10     +     num  [  i  ]     -     '0'  )     %     mod  ;      return     res  ;   }   ll     ModExponent  (  ll     a       ll     b       ll     m  )   {      ll     result  ;      if     (  a     ==     0  )      return     0  ;      else     if     (  b     ==     0  )      return     1  ;      else     if     (  b     &     1  )     {      result     =     a     %     m  ;      result     =     result     *     ModExponent  (  a       b     -     1       m  );      }      else     {      result     =     ModExponent  (  a       b     /     2       m  );      result     =     ((  result     *     result  )     %     m     +     m  )     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;   }   int     main  ()   {      // String input as b is very large      string     a     =     '987584345091051645734583954832576'  ;      // String input as b is very large      ll     b     =     3  ;      ll     m     =     11  ;      ll     remainderA     =     MOD  (  a       m  );      cout      < <     ModExponent  (  remainderA       b       m  );      return     0  ;   }   
Java
   // Java program to find (a^b) mod m for a large 'a' with an   // efficient approach.   public     class   GFG      {          // Reduce the number B to a small number      // using Fermat Little      static     long     MOD  (  String     num       long     mod  )      {      long     res     =     0  ;      for     (  int     i     =     0  ;     i      <     num  .  length  ();     i  ++  )     {      res     =     (  res     *     10     +     num  .  charAt  (  i  )     -     '0'  )     %     mod  ;      }      return     res  ;      }      // Calculate the ModExponent of the given large number      // 'a'      static     long     ModExponent  (  long     a       long     b       long     m  )      {      long     result  ;      if     (  a     ==     0  )     {      return     0  ;      }      else     if     (  b     ==     0  )     {      return     1  ;      }      else     if     (  b     %     2     !=     0  )     {      result     =     a     %     m  ;      result     =     result     *     ModExponent  (  a       b     -     1       m  );      }      else     {      result     =     ModExponent  (  a       b     /     2       m  );      result     =     ((  result     *     result  )     %     m     +     m  )     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;      }      public     static     void     main  (  String  []     args  )      {      // String input as a is very large      String     a     =     '987584345091051645734583954832576'  ;      long     b     =     3  ;      long     m     =     11  ;      long     remainderA     =     MOD  (  a       m  );      System  .  out  .  println  (  ModExponent  (  remainderA       b       m  ));      }   }   // The code is contributed by Gautam goel (gautamgoel962)   
Python3
   # Python3 program to find (a^b) mod m   # for a large 'a'   # Utility function to calculate a%m   def   MOD  (  s     mod  ):   res   =   0   for   i   in   range  (  len  (  s  )):   res   =   (  res   *   10   +   int  (  s  [  i  ]))   %   mod   return   res   # Returns find (a^b) % m   def   ModExponent  (  a     b     m  ):   if   (  a   ==   0  ):   return   0   elif   (  b   ==   0  ):   return   1   elif   (  b   %   2   !=   0  ):   result   =   a   %   m   result   =   result   *   ModExponent  (  a     b   -   1     m  )   else  :   result   =   ModExponent  (  a     b   /   2     m  )   result   =   ((  result   *   result  )   %   m   +   m  )   %   m   return   (  result   %   m   +   m  )   %   m   # Driver Code   a   =   '987584345091051645734583954832576'   b   =   3   m   =   11   remainderA   =   MOD  (  a     m  )   print  (  ModExponent  (  remainderA     b     m  ))   # This code is contributed by phasing17   
C#
   // C# program to find (a^b) mod m for a large 'a' with an   // efficient approach.   using     System  ;   using     System.Collections.Generic  ;   public     class     GFG     {      // Reduce the number B to a small number      // using Fermat Little      static     long     MOD  (  string     num       long     mod  )      {      long     res     =     0  ;      for     (  int     i     =     0  ;     i      <     num  .  Length  ;     i  ++  )     {      res     =     (  res     *     10     +     num  [  i  ]     -     '0'  )     %     mod  ;      }      return     res  ;      }      // Calculate the ModExponent of the given large number      // 'a'      static     long     ModExponent  (  long     a       long     b       long     m  )      {      long     result  ;      if     (  a     ==     0  )     {      return     0  ;      }      else     if     (  b     ==     0  )     {      return     1  ;      }      else     if     (  b     %     2     !=     0  )     {      result     =     a     %     m  ;      result     =     result     *     ModExponent  (  a       b     -     1       m  );      }      else     {      result     =     ModExponent  (  a       b     /     2       m  );      result     =     ((  result     *     result  )     %     m     +     m  )     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;      }      // Driver Code      public     static     void     Main  (  string  []     args  )      {      // String input as a is very large      string     a     =     '987584345091051645734583954832576'  ;      long     b     =     3  ;      long     m     =     11  ;      // Function Call      long     remainderA     =     MOD  (  a       m  );      Console  .  WriteLine  (  ModExponent  (  remainderA       b       m  ));      }   }   // The code is contributed by phasing17   
JavaScript
    <  script  >   // JavaScript program to find (a^b) mod m   // for a large 'a'   // Utility function to calculate a%m   function     MOD  (  s       mod  )   {          var     res     =     0  ;      for     (  var     i     =     0  ;     i      <     s  .  length  ;     i  ++  )     {      res     =     (  res     *     10     +     (  s  [  i  ]     -     '0'  ))     %     mod  ;      }      return     res  ;   }   // Returns find (a^b) % m   function     ModExponent  (  a       b       m  )   {          var     result  ;      if     (  a     ==     0  )     {      return     0  ;      }      else     if     (  b     ==     0  )     {      return     1  ;      }      else     if     (  b     %     2     !=     0  )     {      result     =     a     %     m  ;      result     =     result     *     ModExponent  (  a       b     -     1       m  );      }      else     {      result     =     ModExponent  (  a       b     /     2       m  );      result     =     ((  result     *     result  )     %     m     +     m  )     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;   }       // Driver Code   let     a     =     '987584345091051645734583954832576'  ;   let     b     =     3       m     =     11  ;   var     remainderA     =     MOD  (  a       m  );   document  .  write  (  ModExponent  (  remainderA       b       m  ));   // This code is contributed by shinjanpatra.    <  /script>   

Sortir
10 

Complexité temporelle : O(len(a)+ log b)

Espace auxiliaire : O (logb)

Code itératif économe en espace :

C++14
   // C++ program to find (a^b) mod m for a large 'a'   #include       using     namespace     std  ;   typedef     long     long     ll  ;   // utility function to calculate a%m and b%m   ll     aModM  (  string     s       ll     mod  )   {      ll     number     =     0  ;      for     (  ll     i     =     0  ;     i      <     s  .  length  ();     i  ++  )      {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number  *  10     +     (  s  [  i  ]     -     '0'  ));      number     %=     mod  ;      }      return     number  ;   }   // Returns find (a^b) % m   ll     ApowBmodM  (  ll     x       ll     y    ll     m  )   {      ll     res  =  1  ;      while  (  y  )      {      if  (  y  &  1  )      res  =  (  res  *  x  )  %  m  ;      y  =  y  >>  1  ;      x  =  ((  x  *  x  )  %  m  +  m  )  %  m  ;      }      return     (  res  %  m  +  m  )  %  m  ;   }   // Driver program to run the case   int     main  ()   {      string     a     =     '987584345091051645734583954832576'  ;      ll     b  =  3  ;      ll     m  =  11  ;      // Find a%m      ll     x  =  aModM  (  a    m  );      cout      < <     ApowBmodM  (  x    b    m  );      return     0  ;   }   
Java
   // Java program to find (a^b) mod m for a large 'a'   import     java.util.*  ;   class   GFG     {      // utility function to calculate a%m and b%m      static     long     aModM  (  String     s       long     mod  )      {      long     number     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )     {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number     *     10     +     (  s  .  charAt  (  i  )     -     '0'  ));      number     %=     mod  ;      }      return     number  ;      }      // Returns find (a^b) % m      static     long     ApowBmodM  (  long     x       long     y       long     m  )      {      long     res     =     1  ;      while     (  y     >     0  )     {      if     ((  y     &     1  )     !=     0  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1  ;      x     =     ((  x     *     x  )     %     m     +     m  )     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;      }      // Driver program to run the case      public     static     void     main  (  String  []     args  )      {      String     a     =     '987584345091051645734583954832576'  ;      long     b     =     3  ;      long     m     =     11  ;      // Find a%m      long     x     =     aModM  (  a       m  );      System  .  out  .  println  (  ApowBmodM  (  x       b       m  ));      }   }   // This code is contributed by phasing17   
Python3
   # Python3 program to find (a^b) mod m for a large 'a'   # utility function to calculate a%m and b%m   def   aModM  (  s     mod  ):   number   =   0  ;   for   i   in   range  (  len  (  s  )):   # int(s[i]) gives the digit value and form   # the number   number   =   (  number   *   10   +   int  (  s  [  i  ]));   number   %=   mod  ;   return   number  ;   # Returns find (a^b) % m   def   ApowBmodM  (  x     y     m  ):   res   =   1  ;   while   (  y   >   0  ):   if   (  y   &   1  ):   res   =   (  res   *   x  )   %   m  ;   y   =   y   >>   1  ;   x   =   ((  x   *   x  )   %   m   +   m  )   %   m  ;   return   (  res   %   m   +   m  )   %   m  ;   # Driver program to run the case   a   =   '987584345091051645734583954832576'  ;   b   =   3  ;   m   =   11  ;   # Find a%m   x   =   aModM  (  a     m  );   print  (  ApowBmodM  (  x     b     m  ));   # This code is contributed by phasing17   
C#
   // C# program to find (a^b) mod m for a large 'a'   using     System  ;   class     GFG   {      // utility function to calculate a%m and b%m      static     long     aModM  (  string     s       long     mod  )      {      long     number     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  Length  ;     i  ++  )      {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number     *     10     +     (  s  [  i  ]     -     '0'  ));      number     %=     mod  ;      }      return     number  ;      }      // Returns find (a^b) % m      static     long     ApowBmodM  (  long     x       long     y       long     m  )      {      long     res     =     1  ;      while     (  y     >     0  )     {      if     ((  y     &     1  )     !=     0  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1  ;      x     =     ((  x     *     x  )     %     m     +     m  )     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;      }      // Driver program to run the case      public     static     void     Main  (  string  []     args  )      {      string     a     =     '987584345091051645734583954832576'  ;      long     b     =     3  ;      long     m     =     11  ;      // Find a%m      long     x     =     aModM  (  a       m  );      Console  .  WriteLine  (  ApowBmodM  (  x       b       m  ));      }   }   // This code is contributed by phasing17   
JavaScript
   // JavaScript program to find (a^b) mod m for a large 'a'   // utility function to calculate a%m and b%m   function     aModM  (  s       mod  )   {      let     number     =     0  ;      for     (  var     i     =     0  ;     i      <     s  .  length  ;     i  ++  )     {      // parseInt(s[i]) gives the digit value and form      // the number      number     =     (  number     *     10     +     parseInt  (  s  [  i  ]));      number     %=     mod  ;      }      return     number  ;   }   // Returns find (a^b) % m   function     ApowBmodM  (  x       y       m  )   {      let     res     =     1  ;      while     (  y  )     {      if     (  y     &     1  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1  ;      x     =     ((  x     *     x  )     %     m     +     m  )     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;   }   // Driver program to run the case   let     a     =     '987584345091051645734583954832576'  ;   let     b     =     3  ;   let     m     =     11  ;   // Find a%m   let     x     =     aModM  (  a       m  );   console  .  log  (  ApowBmodM  (  x       b       m  ));   // This code is contributed by phasing17   

Sortir
10 

Complexité temporelle : O(len(a)+ log b)

Espace auxiliaire : O(1)

Cas : lorsque « a » et « b » sont tous deux très grands.

Nous pouvons également mettre en œuvre la même approche si les deux 'un' et 'b' était très grand. Dans ce cas, nous aurions d'abord pris contre de cela avec m en utilisant notre aModM fonction. Ensuite, transmettez-le à ce qui précède ApowBmodM fonction récursive ou itérative pour obtenir le résultat requis.

Code récursif :

C++14
   #include          using     namespace     std  ;   typedef     long     long     ll  ;   // Reduce the number B to a small number      // using Fermat Little   ll     MOD  (  string     num    int     mod  )   {      ll     res  =  0  ;          for  (  int     i  =  0  ;  i   <  num  .  length  ();  i  ++  )      res  =  (  res  *  10  +  num  [  i  ]  -  '0'  )  %  mod  ;          return     res  ;   }   ll     ModExponent  (  ll     a    ll     b    ll     m  )   {      ll     result  ;      if  (  a  ==  0  )      return     0  ;      else     if  (  b  ==  0  )      return     1  ;      else     if  (  b  &  1  )      {      result  =  a  %  m  ;      result  =  result  *  ModExponent  (  a    b  -1    m  );      }      else  {      result  =  ModExponent  (  a    b  /  2    m  );      result  =  ((  result  %  m  )  *  (  result  %  m  ))  %  m  ;      }      return     (  result  %  m  +  m  )  %  m  ;   }   int     main  ()   {      // String input as b is very large      string     a     =     '987584345091051645734583954832576'  ;      // String input as b is very large      string     b     =     '467687655456765756453454365476765'  ;      ll     m     =     1000000007  ;      ll     remainderA     =     MOD  (  a    m  );      ll     remainderB     =     MOD  (  b    m  );          cout      < <     ModExponent  (  remainderA       remainderB       m  );          return     0  ;   }   
Java
   /*package whatever //do not write package name here */   import     java.io.*  ;   class   GFG     {      // Reduce the number B to a small number      // using Fermat Little.      static     long     MOD  (  String     num    int     mod  )      {      long     res     =     0  ;      for  (  int     i     =     0  ;     i      <     num  .  length  ();     i  ++  )      {      res     =     (  res     *     10     +     num  .  charAt  (  i  )     -     '0'  )     %     mod  ;      }      return     res  ;      }      static     long     ModExponent  (  long     a    long     b    long     m  ){      long     result     =     0  ;      if  (  a     ==     0  )      return     0  ;      else     if  (  b     ==     0  )      return     1  ;      else     if  ((  b  &  1  )     ==     1  ){      result     =     a     %     m  ;      result     =     result  *  ModExponent  (  a       b     -     1       m  );      }      else  {      result     =     ModExponent  (  a       b  /  2       m  );      result     =     ((  result     %     m  )  *  (  result     %     m  ))     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;      }      public     static     void     main     (  String  []     args  )     {      // String input as b is very large      String     a     =     '987584345091051645734583954832576'  ;      // String input as b is very large      String     b     =     '467687655456765756453454365476765'  ;      int     m     =     1000000007  ;      long     remainderA     =     MOD  (  a    m  );      long     remainderB     =     MOD  (  b    m  );      System  .  out  .  println  (  ModExponent  (  remainderA       remainderB       m  ));      }   }   // This code is contributed by aadityapburujwale   
Python3
   # Python3 program to implement the approach   # Reduce the number B to a small number   # using Fermat Little   def   MOD  (  num     mod  ):   res   =   0  ;   for   i   in   range  (  len  (  num  )):   res   =   (  res   *   10   +   int  (  num  [  i  ]))   %   mod  ;   return   res  ;   def   ModExponent  (  a     b     m  ):   if   (  a   ==   0  ):   return   0  ;   elif   (  b   ==   0  ):   return   1  ;   elif   (  b   &   1  ):   result   =   a   %   m  ;   result   =   result   *   ModExponent  (  a     b   -   1     m  );   else  :   b   =   b   //   2   result   =   ModExponent  (  a     b     m  );   result   =   ((  result   %   m  )   *   (  result   %   m  ))   %   m  ;   return   (  result   %   m   +   m  )   %   m  ;   # String input as b is very large   a   =   '987584345091051645734583954832576'  ;   # String input as b is very large   b   =   '467687655456765756453454365476765'  ;   m   =   1000000007  ;   remainderA   =   (  MOD  (  a     m  ));   remainderB   =   (  MOD  (  b     m  ));   print  (  ModExponent  (  remainderA     remainderB     m  ));   # This code is contributed by phasing17   
C#
   // C# program to implement the approach   using     System  ;   using     System.Collections.Generic  ;   class     GFG     {      // Reduce the number B to a small number      // using Fermat Little.      static     long     MOD  (  string     num       int     mod  )      {      long     res     =     0  ;      for     (  int     i     =     0  ;     i      <     num  .  Length  ;     i  ++  )     {      res     =     (  res     *     10     +     num  [  i  ]     -     '0'  )     %     mod  ;      }      return     res  ;      }      static     long     ModExponent  (  long     a       long     b       long     m  )      {      long     result     =     0  ;      if     (  a     ==     0  )      return     0  ;      else     if     (  b     ==     0  )      return     1  ;      else     if     ((  b     &     1  )     ==     1  )     {      result     =     a     %     m  ;      result     =     result     *     ModExponent  (  a       b     -     1       m  );      }      else     {      result     =     ModExponent  (  a       b     /     2       m  );      result     =     ((  result     %     m  )     *     (  result     %     m  ))     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;      }      public     static     void     Main  (  string  []     args  )      {      // String input as b is very large      string     a     =     '987584345091051645734583954832576'  ;      // String input as b is very large      string     b     =     '467687655456765756453454365476765'  ;      int     m     =     1000000007  ;      long     remainderA     =     MOD  (  a       m  );      long     remainderB     =     MOD  (  b       m  );      Console  .  WriteLine  (      ModExponent  (  remainderA       remainderB       m  ));      }   }   // This code is contributed by phasing17   
JavaScript
   // JavaScript program to implement the approach   // Reduce the number B to a small number   // using Fermat Little   function     MOD  (  num       mod  )   {      let     res     =     0  ;      for     (  var     i     =     0  ;     i      <     num  .  length  ;     i  ++  )      res     =     (  res     *     10     +     parseInt  (  num  [  i  ]))     %     mod  ;      return     res  ;   }   function     ModExponent  (  a       b       m  )   {      let     result  ;      if     (  a     ==     0n  )      return     0n  ;      else     if     (  b     ==     0n  )      return     1n  ;      else     if     (  b     &     1n  )     {      result     =     a     %     m  ;      result     =     result     *     ModExponent  (  a       b     -     1n       m  );      }      else     {      b     =     b     /     2n     -     (  b     %     2n  );      result     =     ModExponent  (  a       b       m  );      result     =     ((  result     %     m  )     *     (  result     %     m  ))     %     m  ;      }      return     (  result     %     m     +     m  )     %     m  ;   }   // String input as b is very large   let     a     =     '987584345091051645734583954832576'  ;   // String input as b is very large   let     b     =     '467687655456765756453454365476765'  ;   let     m     =     1000000007  ;   let     remainderA     =     BigInt  (  MOD  (  a       m  ));   let     remainderB     =     BigInt  (  MOD  (  b       m  ));   console  .  log  (  ModExponent  (  remainderA       remainderB       BigInt  (  m  )));   // This code is contributed by phasing17   

Sortir
546081867 

Complexité temporelle : O(len(a)+len(b)+log b)

Espace auxiliaire : O (logb)

Code itératif économe en espace :

C++14
   // C++ program to find (a^b) mod m for a large 'a'   #include          using     namespace     std  ;   typedef     long     long     ll  ;   // utility function to calculate a%m and b%m   ll     aModM  (  string     s       ll     mod  )   {      ll     number     =     0  ;      for     (  ll     i     =     0  ;     i      <     s  .  length  ();     i  ++  )     {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number     *     10     +     (  s  [  i  ]     -     '0'  ));      number     %=     mod  ;      }      return     number  ;   }   // Returns find (a^b) % m   ll     ApowBmodM  (  string  &     a       string  &     b       ll     m  )   {      ll     res     =     1  ;      // Find a%m      ll     x     =     aModM  (  a       m  );      // Find b%m      ll     y     =     aModM  (  b       m  );      while     (  y  )     {      if     (  y     &     1  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1  ;      x     =     ((  x     %     m  )     *     (  x     %     m  ))     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;   }   // Driver program to run the case   int     main  ()   {      string     a     =     '987584345091051645734583954832576'  ;      string     b     =     '467687655456765756453454365476765'  ;      ll     m     =     1000000007  ;      cout      < <     ApowBmodM  (  a       b       m  );      return     0  ;   }   
Java
   /*package whatever //do not write package name here */   import     java.io.*  ;   class   GFG     {      // utility function to calculate a%m and b%m      static     long     aModM  (  String     s       long     mod  ){      long     number     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  length  ();     i  ++  )      {      // (s.charAt(i)-'0') gives the digit value and form      // the number      number     =     (  number     *     10     +     (  s  .  charAt  (  i  )     -     '0'  ));      number     %=     mod  ;      }      return     number  ;      }      // Returns find (a^b) % m      static     long     ApowBmodM  (  String     a       String     b       long     m  )      {      long     res     =     1  ;      // Find a%m      long     x     =     aModM  (  a       m  );      // Find b%m      long     y     =     aModM  (  b       m  );      while     (  y  >  0  )     {      if     ((  y     &     1  )  ==  1  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1  ;      x     =     ((  x     %     m  )     *     (  x     %     m  ))     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;      }      public     static     void     main     (  String  []     args  )     {      String     a     =     '987584345091051645734583954832576'  ;      String     b     =     '467687655456765756453454365476765'  ;      long     m     =     1000000007  ;      System  .  out  .  println  (  ApowBmodM  (  a       b       m  ));      }   }   // This code is contributed by aadityapburujwale   
Python3
   # Python3 program to find (a^b) mod m for a large 'a'   # utility function to calculate a%m and b%m   def   aModM  (  s     mod  ):   number   =   0   for   i   in   range  (  len  (  s  )):   # (s[i]-'0') gives the digit value and form   # the number   number   =   (  number   *   10   +   (  int  (  s  [  i  ])))   number   %=   mod   return   number   # Returns find (a^b) % m   def   ApowBmodM  (  a     b     m  ):   res   =   1   # Find a%m   x   =   aModM  (  a     m  )   # Find b%m   y   =   aModM  (  b     m  )   while   (  y   >   0  ):   if   (  y   &   1  ):   res   =   (  res   *   x  )   %   m   y   =   y   >>   1   x   =   ((  x   %   m  )   *   (  x   %   m  ))   %   m   return   (  res   %   m   +   m  )   %   m   # Driver program to run the case   a   =   '987584345091051645734583954832576'   b   =   '467687655456765756453454365476765'   m   =   1000000007   print  (  ApowBmodM  (  a     b     m  ))   # This code is contributed by phasing17   
JavaScript
   // JavaScript program to find (a^b) mod m for a large 'a'   // utility function to calculate a%m and b%m   function     aModM  (  s       mod  )   {      let     number     =     0n  ;      for     (  let     i     =     0  ;     i      <     s  .  length  ;     i  ++  )     {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number     *     10n     +     BigInt  (  parseInt  (  s  [  i  ])));      number     %=     mod  ;      }      return     number  ;   }   // Returns find (a^b) % m   function     ApowBmodM  (  a       b       m  )   {      let     res     =     1n  ;      // Find a%m      let     x     =     BigInt  (  aModM  (  a       m  ));      // Find b%m      let     y     =     BigInt  (  aModM  (  b       m  ));      while     (  y     >     0n  )     {      if     (  y     &     1n  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1n  ;      x     =     ((  x     %     m  )     *     (  x     %     m  ))     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;   }   // Driver program to run the case   let     a     =     '987584345091051645734583954832576'  ;   let     b     =     '467687655456765756453454365476765'  ;   let     m     =     1000000007n  ;   console  .  log  (  ApowBmodM  (  a       b       m  ));   // This code is contributed by phasing17   
C#
   // C# program to find (a^b) mod m for a large 'a'   using     System  ;   using     System.Collections.Generic  ;   class     GFG     {      // utility function to calculate a%m and b%m      static     long     aModM  (  string     s       long     mod  )      {      long     number     =     0  ;      for     (  int     i     =     0  ;     i      <     s  .  Length  ;     i  ++  )     {      // (s[i]-'0') gives the digit value and form      // the number      number     =     (  number     *     10     +     (  s  [  i  ]     -     '0'  ));      number     %=     mod  ;      }      return     number  ;      }      // Returns find (a^b) % m      static     long     ApowBmodM  (  string     a       string     b       long     m  )      {      long     res     =     1  ;      // Find a%m      long     x     =     aModM  (  a       m  );      // Find b%m      long     y     =     aModM  (  b       m  );      while     (  y     !=     0  )     {      if     ((  y     &     1  )     !=     0  )      res     =     (  res     *     x  )     %     m  ;      y     =     y     >>     1  ;      x     =     ((  x     %     m  )     *     (  x     %     m  ))     %     m  ;      }      return     (  res     %     m     +     m  )     %     m  ;      }      // Driver program to run the case      public     static     void     Main  (  string  []     args  )      {      string     a     =     '987584345091051645734583954832576'  ;      string     b     =     '467687655456765756453454365476765'  ;      long     m     =     1000000007  ;      Console  .  WriteLine  (  ApowBmodM  (  a       b       m  ));      }   }   // This code is contributed by phasing17   

Sortir
546081867 

Complexité temporelle : O(len(a)+len(b)+log b)

Espace auxiliaire : O(1)


Si tu aimes GeekspourGeeks et que vous souhaitez contribuer, vous pouvez également écrire un article en utilisant écrire.geeksforgeeks.org ou envoyez votre article à [email protected].
 

Créer un quiz