如果满足以下模块化算术条件,则将数字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