Steino algoritmas ieškant GCD

Steino algoritmas ieškant GCD
Išbandykite GfG praktikoje

Steino algoritmas arba dvejetainis GCD algoritmas yra algoritmas, apskaičiuojantis didžiausią bendrą dviejų neneigiamų sveikųjų skaičių daliklį. Steino algoritmas dalijimą pakeičia aritmetiniais poslinkių palyginimais ir atimtimi.

Pavyzdžiai:  

Įvestis : a = 17 b = 34
Išvestis : 17

Įvestis : a = 50 b = 49
Išvestis : 1

Algoritmas GCD rasti naudojant Steino algoritmą gcd(a b)  

Algoritmas daugiausia yra optimizavimas, palyginti su standartu Euklido algoritmas GCD

  1. Jei ir a, ir b yra 0, gcd yra nulis gcd(0 0) = 0.
  2. gcd(a 0) = a ir gcd(0 b) = b, nes viskas dalijasi iš 0.
  3. Jei a ir b yra lygūs gcd(a b) = 2*gcd(a/2 b/2), nes 2 yra bendras daliklis. Daugyba iš 2 gali būti atlikta naudojant bitinio poslinkio operatorių.
  4. Jei a lyginis, o b nelyginis gcd(a b) = gcd(a/2 b). Panašiai, jei a yra nelyginis, o b yra lyginis 
    gcd(a b) = gcd(a b/2). Taip yra todėl, kad 2 nėra bendras daliklis.
  5. Jei ir a, ir b yra nelyginiai, tada gcd(a b) = gcd(|a-b|/2 b). Atkreipkite dėmesį, kad dviejų nelyginių skaičių skirtumas yra lyginis
  6. Kartokite 3–5 veiksmus, kol a = b arba tol, kol a = 0. Bet kuriuo atveju GCD yra galia (2 k) * b, kur galia (2 k) yra 2 padidinimas iki k laipsnio, o k yra bendrųjų koeficientų skaičius 2, rastas 3 veiksme.
C++
   // Iterative C++ program to   // implement Stein's Algorithm   #include          using     namespace     std  ;   // Function to implement   // Stein's Algorithm   int     gcd  (  int     a       int     b  )   {      /* GCD(0 b) == b; GCD(a 0) == a    GCD(0 0) == 0 */      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      /*Finding K where K is the    greatest power of 2    that divides both a and b. */      int     k  ;      for     (  k     =     0  ;     ((  a     |     b  )     &     1  )     ==     0  ;     ++  k  )         {      a     >>=     1  ;      b     >>=     1  ;      }      /* Dividing a by 2 until a becomes odd */      while     ((  a     &     1  )     ==     0  )      a     >>=     1  ;      /* From here on 'a' is always odd. */      do      {      /* If b is even remove all factor of 2 in b */      while     ((  b     &     1  )     ==     0  )      b     >>=     1  ;      /* Now a and b are both odd.    Swap if necessary so a  <= b    then set b = b - a (which is even).*/      if     (  a     >     b  )      swap  (  a       b  );     // Swap u and v.      b     =     (  b     -     a  );      }  while     (  b     !=     0  );      /* restore common factors of 2 */      return     a      < <     k  ;   }   // Driver code   int     main  ()   {      int     a     =     34       b     =     17  ;      printf  (  'Gcd of given numbers is %d  n  '       gcd  (  a       b  ));      return     0  ;   }   
Java
   // Iterative Java program to   // implement Stein's Algorithm   import     java.io.*  ;   class   GFG     {      // Function to implement Stein's      // Algorithm      static     int     gcd  (  int     a       int     b  )      {      // GCD(0 b) == b; GCD(a 0) == a      // GCD(0 0) == 0      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      // Finding K where K is the greatest      // power of 2 that divides both a and b      int     k  ;      for     (  k     =     0  ;     ((  a     |     b  )     &     1  )     ==     0  ;     ++  k  )         {      a     >>=     1  ;      b     >>=     1  ;      }      // Dividing a by 2 until a becomes odd      while     ((  a     &     1  )     ==     0  )      a     >>=     1  ;      // From here on 'a' is always odd.      do         {      // If b is even remove      // all factor of 2 in b      while     ((  b     &     1  )     ==     0  )      b     >>=     1  ;      // Now a and b are both odd. Swap      // if necessary so a  <= b then set      // b = b - a (which is even)      if     (  a     >     b  )         {      // Swap u and v.      int     temp     =     a  ;      a     =     b  ;      b     =     temp  ;      }      b     =     (  b     -     a  );      }     while     (  b     !=     0  );      // restore common factors of 2      return     a      < <     k  ;      }      // Driver code      public     static     void     main  (  String     args  []  )      {      int     a     =     34       b     =     17  ;      System  .  out  .  println  (  'Gcd of given '      +     'numbers is '     +     gcd  (  a       b  ));      }   }   // This code is contributed by Nikita Tiwari   
Python
   # Iterative Python 3 program to   # implement Stein's Algorithm   # Function to implement   # Stein's Algorithm   def   gcd  (  a     b  ):   # GCD(0 b) == b; GCD(a 0) == a   # GCD(0 0) == 0   if   (  a   ==   0  ):   return   b   if   (  b   ==   0  ):   return   a   # Finding K where K is the   # greatest power of 2 that   # divides both a and b.   k   =   0   while  (((  a   |   b  )   &   1  )   ==   0  ):   a   =   a   >>   1   b   =   b   >>   1   k   =   k   +   1   # Dividing a by 2 until a becomes odd   while   ((  a   &   1  )   ==   0  ):   a   =   a   >>   1   # From here on 'a' is always odd.   while  (  b   !=   0  ):   # If b is even remove all   # factor of 2 in b   while   ((  b   &   1  )   ==   0  ):   b   =   b   >>   1   # Now a and b are both odd. Swap if   # necessary so a  <= b then set   # b = b - a (which is even).   if   (  a   >   b  ):   # Swap u and v.   temp   =   a   a   =   b   b   =   temp   b   =   (  b   -   a  )   # restore common factors of 2   return   (  a    < <   k  )   # Driver code   a   =   34   b   =   17   print  (  'Gcd of given numbers is '     gcd  (  a     b  ))   # This code is contributed by Nikita Tiwari.   
C#
   // Iterative C# program to implement   // Stein's Algorithm   using     System  ;   class     GFG     {      // Function to implement Stein's      // Algorithm      static     int     gcd  (  int     a       int     b  )      {      // GCD(0 b) == b; GCD(a 0) == a      // GCD(0 0) == 0      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      // Finding K where K is the greatest      // power of 2 that divides both a and b      int     k  ;      for     (  k     =     0  ;     ((  a     |     b  )     &     1  )     ==     0  ;     ++  k  )         {      a     >>=     1  ;      b     >>=     1  ;      }      // Dividing a by 2 until a becomes odd      while     ((  a     &     1  )     ==     0  )      a     >>=     1  ;      // From here on 'a' is always odd      do         {      // If b is even remove      // all factor of 2 in b      while     ((  b     &     1  )     ==     0  )      b     >>=     1  ;      /* Now a and b are both odd. Swap    if necessary so a  <= b then set    b = b - a (which is even).*/      if     (  a     >     b  )     {      // Swap u and v.      int     temp     =     a  ;      a     =     b  ;      b     =     temp  ;      }      b     =     (  b     -     a  );      }     while     (  b     !=     0  );      /* restore common factors of 2 */      return     a      < <     k  ;      }      // Driver code      public     static     void     Main  ()      {      int     a     =     34       b     =     17  ;      Console  .  Write  (  'Gcd of given '      +     'numbers is '     +     gcd  (  a       b  ));      }   }   // This code is contributed by nitin mittal   
JavaScript
    <  script  >   // Iterative JavaScript program to   // implement Stein's Algorithm   // Function to implement   // Stein's Algorithm   function     gcd  (     a       b  )   {      /* GCD(0 b) == b; GCD(a 0) == a    GCD(0 0) == 0 */      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      /*Finding K where K is the    greatest power of 2    that divides both a and b. */      let     k  ;      for     (  k     =     0  ;     ((  a     |     b  )     &     1  )     ==     0  ;     ++  k  )         {      a     >>=     1  ;      b     >>=     1  ;      }      /* Dividing a by 2 until a becomes odd */      while     ((  a     &     1  )     ==     0  )      a     >>=     1  ;      /* From here on 'a' is always odd. */      do      {      /* If b is even remove all factor of 2 in b */      while     ((  b     &     1  )     ==     0  )      b     >>=     1  ;      /* Now a and b are both odd.    Swap if necessary so a  <= b    then set b = b - a (which is even).*/      if     (  a     >     b  ){      let     t     =     a  ;      a     =     b  ;      b     =     t  ;      }      b     =     (  b     -     a  );      }  while     (  b     !=     0  );      /* restore common factors of 2 */      return     a      < <     k  ;   }   // Driver code      let     a     =     34       b     =     17  ;      document  .  write  (  'Gcd of given numbers is '  +     gcd  (  a       b  ));   // This code contributed by gauravrajput1     <  /script>   
PHP
      // Iterative php program to    // implement Stein's Algorithm   // Function to implement    // Stein's Algorithm   function   gcd  (  $a     $b  )   {   // GCD(0 b) == b; GCD(a 0) == a   // GCD(0 0) == 0   if   (  $a   ==   0  )   return   $b  ;   if   (  $b   ==   0  )   return   $a  ;   // Finding K where K is the greatest   // power of 2 that divides both a and b.   $k  ;   for   (  $k   =   0  ;   ((  $a   |   $b  )   &   1  )   ==   0  ;   ++  $k  )   {   $a   >>=   1  ;   $b   >>=   1  ;   }   // Dividing a by 2 until a becomes odd    while   ((  $a   &   1  )   ==   0  )   $a   >>=   1  ;   // From here on 'a' is always odd.   do   {   // If b is even remove    // all factor of 2 in b    while   ((  $b   &   1  )   ==   0  )   $b   >>=   1  ;   // Now a and b are both odd. Swap   // if necessary so a  <= b then set    // b = b - a (which is even)   if   (  $a   >   $b  )   swap  (  $a     $b  );   // Swap u and v.   $b   =   (  $b   -   $a  );   }   while   (  $b   !=   0  );   // restore common factors of 2   return   $a    < <   $k  ;   }   // Driver code   $a   =   34  ;   $b   =   17  ;   echo   'Gcd of given numbers is '   .   gcd  (  $a     $b  );   // This code is contributed by ajit   ?>   

Išvestis
Gcd of given numbers is 17 

Laiko sudėtingumas: O (N*N)
Pagalbinė erdvė: O(1)

[Numatomas 2 metodas] Rekursyvus įgyvendinimas – O (N*N) Laikas ir O (N*N) Erdvė

C++
   // Recursive C++ program to   // implement Stein's Algorithm   #include          using     namespace     std  ;   // Function to implement   // Stein's Algorithm   int     gcd  (  int     a       int     b  )   {      if     (  a     ==     b  )      return     a  ;      // GCD(0 b) == b; GCD(a 0) == a      // GCD(0 0) == 0      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      // look for factors of 2      if     (  ~  a     &     1  )     // a is even      {      if     (  b     &     1  )     // b is odd      return     gcd  (  a     >>     1       b  );      else     // both a and b are even      return     gcd  (  a     >>     1       b     >>     1  )      < <     1  ;      }      if     (  ~  b     &     1  )     // a is odd b is even      return     gcd  (  a       b     >>     1  );      // reduce larger number      if     (  a     >     b  )      return     gcd  ((  a     -     b  )     >>     1       b  );      return     gcd  ((  b     -     a  )     >>     1       a  );   }   // Driver code   int     main  ()   {      int     a     =     34       b     =     17  ;      printf  (  'Gcd of given numbers is %d  n  '       gcd  (  a       b  ));      return     0  ;   }   
Java
   // Recursive Java program to   // implement Stein's Algorithm   import     java.io.*  ;   class   GFG     {      // Function to implement      // Stein's Algorithm      static     int     gcd  (  int     a       int     b  )      {      if     (  a     ==     b  )      return     a  ;      // GCD(0 b) == b; GCD(a 0) == a      // GCD(0 0) == 0      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      // look for factors of 2      if     ((  ~  a     &     1  )     ==     1  )     // a is even      {      if     ((  b     &     1  )     ==     1  )     // b is odd      return     gcd  (  a     >>     1       b  );      else     // both a and b are even      return     gcd  (  a     >>     1       b     >>     1  )      < <     1  ;      }      // a is odd b is even      if     ((  ~  b     &     1  )     ==     1  )      return     gcd  (  a       b     >>     1  );      // reduce larger number      if     (  a     >     b  )      return     gcd  ((  a     -     b  )     >>     1       b  );      return     gcd  ((  b     -     a  )     >>     1       a  );      }      // Driver code      public     static     void     main  (  String     args  []  )      {      int     a     =     34       b     =     17  ;      System  .  out  .  println  (  'Gcd of given'      +     'numbers is '     +     gcd  (  a       b  ));      }   }   // This code is contributed by Nikita Tiwari   
Python
   # Recursive Python 3 program to   # implement Stein's Algorithm   # Function to implement   # Stein's Algorithm   def   gcd  (  a     b  ):   if   (  a   ==   b  ):   return   a   # GCD(0 b) == b; GCD(a 0) == a   # GCD(0 0) == 0   if   (  a   ==   0  ):   return   b   if   (  b   ==   0  ):   return   a   # look for factors of 2   # a is even   if   ((  ~  a   &   1  )   ==   1  ):   # b is odd   if   ((  b   &   1  )   ==   1  ):   return   gcd  (  a   >>   1     b  )   else  :   # both a and b are even   return   (  gcd  (  a   >>   1     b   >>   1  )    < <   1  )   # a is odd b is even   if   ((  ~  b   &   1  )   ==   1  ):   return   gcd  (  a     b   >>   1  )   # reduce larger number   if   (  a   >   b  ):   return   gcd  ((  a   -   b  )   >>   1     b  )   return   gcd  ((  b   -   a  )   >>   1     a  )   # Driver code   a     b   =   34     17   print  (  'Gcd of given numbers is '     gcd  (  a     b  ))   # This code is contributed   # by Nikita Tiwari.   
C#
   // Recursive C# program to   // implement Stein's Algorithm   using     System  ;   class     GFG     {      // Function to implement      // Stein's Algorithm      static     int     gcd  (  int     a       int     b  )      {      if     (  a     ==     b  )      return     a  ;      // GCD(0 b) == b;      // GCD(a 0) == a      // GCD(0 0) == 0      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;      // look for factors of 2      // a is even      if     ((  ~  a     &     1  )     ==     1  )     {      // b is odd      if     ((  b     &     1  )     ==     1  )      return     gcd  (  a     >>     1       b  );      else      // both a and b are even      return     gcd  (  a     >>     1       b     >>     1  )      < <     1  ;      }      // a is odd b is even      if     ((  ~  b     &     1  )     ==     1  )      return     gcd  (  a       b     >>     1  );      // reduce larger number      if     (  a     >     b  )      return     gcd  ((  a     -     b  )     >>     1       b  );      return     gcd  ((  b     -     a  )     >>     1       a  );      }      // Driver code      public     static     void     Main  ()      {      int     a     =     34       b     =     17  ;      Console  .  Write  (  'Gcd of given'      +     'numbers is '     +     gcd  (  a       b  ));      }   }   // This code is contributed by nitin mittal.   
JavaScript
    <  script  >   // JavaScript program to   // implement Stein's Algorithm      // Function to implement      // Stein's Algorithm      function     gcd  (  a       b  )      {      if     (  a     ==     b  )      return     a  ;          // GCD(0 b) == b; GCD(a 0) == a      // GCD(0 0) == 0      if     (  a     ==     0  )      return     b  ;      if     (  b     ==     0  )      return     a  ;          // look for factors of 2      if     ((  ~  a     &     1  )     ==     1  )     // a is even      {      if     ((  b     &     1  )     ==     1  )     // b is odd      return     gcd  (  a     >>     1       b  );          else     // both a and b are even      return     gcd  (  a     >>     1       b     >>     1  )      < <     1  ;      }          // a is odd b is even      if     ((  ~  b     &     1  )     ==     1  )      return     gcd  (  a       b     >>     1  );          // reduce larger number      if     (  a     >     b  )      return     gcd  ((  a     -     b  )     >>     1       b  );          return     gcd  ((  b     -     a  )     >>     1       a  );      }   // Driver Code      let     a     =     34       b     =     17  ;      document  .  write  (  'Gcd of given '      +     'numbers is '     +     gcd  (  a       b  ));        <  /script>   
PHP
      // Recursive PHP program to   // implement Stein's Algorithm   // Function to implement   // Stein's Algorithm   function   gcd  (  $a     $b  )   {   if   (  $a   ==   $b  )   return   $a  ;   /* GCD(0 b) == b; GCD(a 0) == a    GCD(0 0) == 0 */   if   (  $a   ==   0  )   return   $b  ;   if   (  $b   ==   0  )   return   $a  ;   // look for factors of 2   if   (  ~  $a   &   1  )   // a is even   {   if   (  $b   &   1  )   // b is odd   return   gcd  (  $a   >>   1     $b  );   else   // both a and b are even   return   gcd  (  $a   >>   1     $b   >>   1  )    < <   1  ;   }   if   (  ~  $b   &   1  )   // a is odd b is even   return   gcd  (  $a     $b   >>   1  );   // reduce larger number   if   (  $a   >   $b  )   return   gcd  ((  $a   -   $b  )   >>   1     $b  );   return   gcd  ((  $b   -   $a  )   >>   1     $a  );   }   // Driver code   $a   =   34  ;   $b   =   17  ;   echo   'Gcd of given numbers is: '     gcd  (  $a     $b  );   // This code is contributed by aj_36   ?>   

Išvestis
Gcd of given numbers is 17 

Laiko sudėtingumas : O(N*N), kur N yra didesnio skaičiaus bitų skaičius.
Pagalbinė erdvė: O(N*N), kur N yra didesnio skaičiaus bitų skaičius.

Jums taip pat gali patikti - Pagrindinis ir išplėstinis euklido algoritmas

Privalumai prieš Euklido GCD algoritmą

  • Steino algoritmas yra optimizuota Euklido GCD algoritmo versija.
  • tai efektyviau naudojant bitinio poslinkio operatorių.