Carmichael skaičiai

Carmichael skaičiai
Išbandykite GfG praktikoje #practiceLinkDiv { display: none !important; }

Skaičius n laikomas Karmichaelio skaičiumi, jei jis atitinka šią modulinę aritmetinę sąlygą: 
 

 power(b n-1) MOD n = 1 for all b ranging from 1 to n such that b and n are relatively prime i.e gcd(b n) = 1  

Duotas teigiamas sveikasis skaičius n, suraskite, ar tai yra Carmichael skaičius. Šie skaičiai yra svarbūs Fermato metodas pirmumo tyrimui .
Pavyzdžiai:  
 

Input : n = 8 Output : false Explanation : 8 is not a Carmichael number because 3 is relatively prime to 8 and (3 8-1 ) % 8 = 2187 % 8 is not 1. Input : n = 561 Output : true 
Recommended Practice Carmichael skaičiai Išbandykite!

Idėja paprasta, kartojame visus skaičius nuo 1 iki n ir kiekvienam santykinai pirminiam skaičiui patikriname, ar jo (n-1)-oji galia pagal modulį n yra 1, ar ne. 
Žemiau yra programa, skirta patikrinti, ar nurodytas numeris yra Carmichael, ar ne. 



C++
   // A C++ program to check if a number is   // Carmichael or not.   #include          using     namespace     std  ;   // utility function to find gcd of two numbers   int     gcd  (  int     a       int     b  )   {      if     (  a      <     b  )      return     gcd  (  b       a  );      if     (  a     %     b     ==     0  )      return     b  ;      return     gcd  (  b       a     %     b  );   }   // utility function to find pow(x y) under   // given modulo mod   int     power  (  int     x       int     y       int     mod  )   {      if     (  y     ==     0  )      return     1  ;      int     temp     =     power  (  x       y     /     2       mod  )     %     mod  ;      temp     =     (  temp     *     temp  )     %     mod  ;      if     (  y     %     2     ==     1  )      temp     =     (  temp     *     x  )     %     mod  ;      return     temp  ;   }   // This function receives an integer n and   // finds if it's a Carmichael number   bool     isCarmichaelNumber  (  int     n  )   {      for     (  int     b     =     2  ;     b      <     n  ;     b  ++  )     {      // If 'b' is relatively prime to n      if     (  gcd  (  b       n  )     ==     1  )      // And pow(b n-1)%n is not 1      // return false.      if     (  power  (  b       n     -     1       n  )     !=     1  )      return     false  ;      }      return     true  ;   }   // Driver function   int     main  ()   {      cout      < <     isCarmichaelNumber  (  500  )      < <     endl  ;      cout      < <     isCarmichaelNumber  (  561  )      < <     endl  ;      cout      < <     isCarmichaelNumber  (  1105  )      < <     endl  ;      return     0  ;   }   
Java
   // JAVA program to check if a number is   // Carmichael or not.   import     java.io.*  ;   class   GFG     {      // utility function to find gcd of      // two numbers      static     int     gcd  (  int     a       int     b  )      {      if     (  a      <     b  )      return     gcd  (  b       a  );      if     (  a     %     b     ==     0  )      return     b  ;      return     gcd  (  b       a     %     b  );      }      // utility function to find pow(x y)      // under given modulo mod      static     int     power  (  int     x       int     y       int     mod  )      {      if     (  y     ==     0  )      return     1  ;      int     temp     =     power  (  x       y     /     2       mod  )     %     mod  ;      temp     =     (  temp     *     temp  )     %     mod  ;      if     (  y     %     2     ==     1  )      temp     =     (  temp     *     x  )     %     mod  ;      return     temp  ;      }      // This function receives an integer n and      // finds if it's a Carmichael number      static     int     isCarmichaelNumber  (  int     n  )      {      for     (  int     b     =     2  ;     b      <     n  ;     b  ++  )     {      // If 'b' is relatively prime to n      if     (  gcd  (  b       n  )     ==     1  )      // And pow(b n-1)%n is not 1      // return false.      if     (  power  (  b       n     -     1       n  )     !=     1  )      return     0  ;      }      return     1  ;      }      // Driver function      public     static     void     main  (  String     args  []  )      {      System  .  out  .  println  (  isCarmichaelNumber  (  500  ));      System  .  out  .  println  (  isCarmichaelNumber  (  561  ));      System  .  out  .  println  (  isCarmichaelNumber  (  1105  ));      }   }   // This code is contributed by Nikita Tiwari.   
Python3
   # A Python program to check if a number is   # Carmichael or not.   # utility function to find gcd of two numbers   def   gcd  (   a     b  )   :   if   (  a    <   b  )   :   return   gcd  (  b     a  )   if   (  a   %   b   ==   0  )   :   return   b   return   gcd  (  b     a   %   b  )   # utility function to find pow(x y) under   # given modulo mod   def   power  (  x     y     mod  )   :   if   (  y   ==   0  )   :   return   1   temp   =   power  (  x     y   //   2     mod  )   %   mod   temp   =   (  temp   *   temp  )   %   mod   if   (  y   %   2   ==   1  )   :   temp   =   (  temp   *   x  )   %   mod   return   temp   # This function receives an integer n and   # finds if it's a Carmichael number   def   isCarmichaelNumber  (   n  )   :   b   =   2   while   b   <  n   :   # If 'b' is relatively prime to n   if   (  gcd  (  b     n  )   ==   1  )   :   # And pow(b n-1)% n is not 1   # return false.   if   (  power  (  b     n   -   1     n  )   !=   1  ):   return   0   b   =   b   +   1   return   1   # Driver function   print   (  isCarmichaelNumber  (  500  ))   print   (  isCarmichaelNumber  (  561  ))   print   (  isCarmichaelNumber  (  1105  ))   # This code is contributed by Nikita Tiwari.   
C#
   // C# program to check if a number is   // Carmichael or not.   using     System  ;   class     GFG     {      // utility function to find gcd of      // two numbers      static     int     gcd  (  int     a       int     b  )      {      if     (  a      <     b  )      return     gcd  (  b       a  );      if     (  a     %     b     ==     0  )      return     b  ;      return     gcd  (  b       a     %     b  );      }      // utility function to find pow(x y)      // under given modulo mod      static     int     power  (  int     x       int     y       int     mod  )      {      if     (  y     ==     0  )      return     1  ;      int     temp     =     power  (  x       y     /     2       mod  )     %     mod  ;      temp     =     (  temp     *     temp  )     %     mod  ;      if     (  y     %     2     ==     1  )      temp     =     (  temp     *     x  )     %     mod  ;      return     temp  ;      }      // This function receives an integer n and      // finds if it's a Carmichael number      static     int     isCarmichaelNumber  (  int     n  )      {      for     (  int     b     =     2  ;     b      <     n  ;     b  ++  )     {      // If 'b' is relatively prime to n      if     (  gcd  (  b       n  )     ==     1  )      // And pow(b n-1)%n is not 1      // return false.      if     (  power  (  b       n     -     1       n  )     !=     1  )      return     0  ;      }      return     1  ;      }      // Driver function      public     static     void     Main  ()      {      Console  .  WriteLine  (  isCarmichaelNumber  (  500  ));      Console  .  WriteLine  (  isCarmichaelNumber  (  561  ));      Console  .  WriteLine  (  isCarmichaelNumber  (  1105  ));      }   }   // This code is contributed by vt_m.   
PHP
      // PHP program to check if a   // number is Carmichael or not.   // utility function to find   // gcd of two numbers   function   gcd  (  $a     $b  )   {   if   (  $a    <   $b  )   return   gcd  (  $b     $a  );   if   (  $a   %   $b   ==   0  )   return   $b  ;   return   gcd  (  $b     $a   %   $b  );   }   // utility function to find    // pow(x y) under given modulo mod   function   power  (  $x     $y     $mod  )   {   if   (  $y   ==   0  )   return   1  ;   $temp   =   power  (  $x     $y   /   2     $mod  )   %   $mod  ;   $temp   =   (  $temp   *   $temp  )   %   $mod  ;   if   (  $y   %   2   ==   1  )   $temp   =   (  $temp   *   $x  )   %   $mod  ;   return   $temp  ;   }   // This function receives an integer   // n and finds if it's a Carmichael   // number   function   isCarmichaelNumber  (  $n  )   {   for   (  $b   =   2  ;   $b    <=   $n  ;   $b  ++  )   {   // If 'b' is relatively    // prime to n   if   (  gcd  (  $b     $n  )   ==   1  )   // And pow(b n - 1) % n    // is not 1 return false.   if   (  power  (  $b     $n   -   1     $n  )   !=   1  )   return   0  ;   }   return   1  ;   }   // Driver Code   echo   isCarmichaelNumber  (  500  )   '   n  '  ;   echo   isCarmichaelNumber  (  561  )   '  n  '  ;   echo   isCarmichaelNumber  (  1105  )   '  n  '  ;   // This code is contributed by ajit   ?>   
JavaScript
    <  script  >      // Javascript program to check if a number is      // Carmichael or not.          // utility function to find gcd of      // two numbers      function     gcd  (  a       b  )      {      if     (  a      <     b  )      return     gcd  (  b       a  );      if     (  a     %     b     ==     0  )      return     b  ;      return     gcd  (  b       a     %     b  );      }          // utility function to find pow(x y)      // under given modulo mod      function     power  (  x       y       mod  )      {      if     (  y     ==     0  )      return     1  ;          let     temp     =     power  (  x       parseInt  (  y     /     2       10  )     mod  )     %     mod  ;      temp     =     (  temp     *     temp  )     %     mod  ;          if     (  y     %     2     ==     1  )      temp     =     (  temp     *     x  )     %     mod  ;          return     temp  ;      }          // This function receives an integer n and      // finds if it's a Carmichael number      function     isCarmichaelNumber  (  n  )      {      for     (  let     b     =     2  ;     b      <     n  ;     b  ++  )     {      // If 'b' is relatively prime to n      if     (  gcd  (  b       n  )     ==     1  )          // And pow(b n-1)%n is not 1      // return false.      if     (  power  (  b       n     -     1       n  )     !=     1  )      return     0  ;      }      return     1  ;      }          document  .  write  (  isCarmichaelNumber  (  500  )     +     ' 
'
); document . write ( isCarmichaelNumber ( 561 ) + '
'
); document . write ( isCarmichaelNumber ( 1105 )); < /script>
C
   // C Program to find if a number is Carmichael Number   #include      int     gcd  (  int     a       int     b  )     //Function to find GCD   {   if     (  a   <  b  )   return     gcd  (  b       a  );   if     (  a     %     b     ==     0  )   return     b  ;   return     gcd  (  b       a     %     b  );   }   // Function to find pow(xy) under given modulo mod   int     power  (  int     x       int     y       int     mod  )      {   if     (  y     ==     0  )   return     1  ;   int     temp     =     power  (  x       y     /     2       mod  )     %     mod  ;   temp     =     (  temp     *     temp  )     %     mod  ;   if     (  y     %     2     ==     1  )   temp     =     (  temp     *     x  )     %     mod  ;   return     temp  ;   }   //Function to find if received number n is a Carmichael number   int     carmichaelnumber  (  int     n  )      {   for     (  int     b  =  2  ;  b   <  n  ;  b  ++  )      {   if     (  gcd  (  b    n  )  ==  1  )   if     (  power  (  b    n  -1    n  )  !=     1  )   {   printf  (  '0'  );   return     0  ;   }   }   printf  (  '1'  );   return     0  ;   };   int     main  ()   {   carmichaelnumber  (  500  );   printf  (  '  n  '  );   carmichaelnumber  (  561  );   printf  (  '  n  '  );   carmichaelnumber  (  1105  );   return     0  ;       // This code is contributed by Susobhan Akhuli   }   

Išvestis:  

0 1 1 

Laiko sudėtingumas: O(n log n)
Pagalbinė erdvė: O(n)


 


Top Straipsniai

Kategorija

Įdomios Straipsniai