Găsiți (a^b)%m unde „a” este foarte mare

Găsiți (a^b)%m unde „a” este foarte mare
Încercați-l pe GfG Practice #practiceLinkDiv { display: none !important; }

Date trei numere a b şi m unde 1 <=bm <=10^6 şi 'o' poate fi foarte mare și conține până la 10^6 cifre. Sarcina este de a găsi (a^b)%m .

Exemple: 

  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 Găsiți (a^b)%m Încearcă!

Această problemă se bazează în esență pe aritmetică modulară. Putem scrie (a^b) % m ca (a%m) * (a%m) * (a%m) * ... (a%m) de b ori . Mai jos este un algoritm pentru a rezolva această problemă: 

  • Deoarece „a” este foarte mare, citiți „a” ca șir.
  • Acum încercăm să reducem „a”. Luăm modulo de „a” cu m o dată, adică; ans = a % m în acest fel acum ans=a%m se află între intervalul întreg de la 1 la 10^6, adică; 1 <= a%m <= 10^6.
  • Acum înmulțiți ani de b-1 ori și simultan să ia mod de înmulțire intermediară rezultat cu m deoarece înmulțirea intermediară a ani poate depăși intervalul întregului și va produce răspuns greșit.
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>   

Ieșire
10 

Complexitatea timpului: O(doar(a)+b)

Spațiu auxiliar: O(1)

Abordare eficientă: Înmulțirile de mai sus pot fi reduse la buștean b prin folosire exponentiare rapidă modulară unde calculăm rezultatul prin reprezentarea binară a exponentului (b) . Dacă bitul setat este 1 Înmulțim valoarea curentă a bazei până la rezultat și pătratăm valoarea bazei pentru fiecare apel recursiv.

Cod recursiv:

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>   

Ieșire
10 

Complexitatea timpului: O(len(a)+ log b)

Spațiu auxiliar: O(logb)

Cod iterativ eficient în spațiu:

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   

Ieșire
10 

Complexitatea timpului: O(len(a)+ log b)

Spațiu auxiliar: O(1)

Caz: când atât „a” cât și „b” sunt foarte mari.

De asemenea, putem implementa aceeași abordare dacă ambele 'o' şi 'b' era foarte mare. În acest caz, am fi luat mai întâi împotriva de ea cu m folosind noastre aModM funcţie. Apoi trece-l la cele de mai sus ApowBmodM funcție recursivă sau iterativă pentru a obține rezultatul dorit.

Cod recursiv:

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   

Ieșire
546081867 

Complexitatea timpului: O(len(a)+len(b)+log b)

Spațiu auxiliar: O(logb)

Cod iterativ eficient în spațiu:

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   

Ieșire
546081867 

Complexitatea timpului: O(len(a)+len(b)+ log b)

Spațiu auxiliar: O(1)


Daca iti place GeeksforGeeks și ați dori să contribui puteți scrie și un articol folosind scrie.geeksforgeeks.org sau trimiteți articolul dumneavoastră la [email protected].
 

Creați un test