📜  卡迈克尔数字

📅  最后修改于: 2021-04-29 13:23:12             🧑  作者: Mango

如果满足以下模块化算术条件,则将数字n称为Carmichael数:

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 

给定正整数n,请确定它是否为Carmichael数。这些数字在费马方法进行素数测试中很重要。
例子 :

Input :  n = 8
Output : false
Explanation : 8 is not a Carmichael number because 3 is 
              relatively prime to 8 and (38-1) % 8
              = 2187 % 8 is not 1.
              
Input :  n = 561
Output : true

这个想法很简单,我们迭代从1到n的所有数字,对于每个相对质数,我们检查其在模n下的第(n-1)次幂是否为1。
以下是检查给定号码是否为Carmichael的程序。

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.


Python
# 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


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


Javascript


输出 :

0
1
1