オイラー関数の実装(C言語)

 まず例を見てみましょう。

 実は、これまでの言葉は問題を解くのに役に立たず、この問題では、n*m*φ(n)*φ(m) の結果を直接出力する必要があります。ここで、φ(n) はオイラー関数です。

まずオイラー関数とは何かを見てみましょう。

1. オイラー関数とは
オイラー関数とは、次のことを指します: 正の整数 n について、以下の正の整数のうち n と互いに素な正の整数の数n (1 を含む) に等しいか、φ ( n ) と表記されます

2. オイラー関数のいくつかの性質
n が素数の場合、φ ( n ) = n - 1;
m の場合and n が互いに素である場合、 φ ( n*m ) = φ ( n ) * φ ( m );
正の整数 n と a が互いに素である場合、
n が奇数の場合、φ ( 2n ) = φ ( n );
n = pk で p が素数の場合、φ ( n ) = (p - 1) * pk-1 = pk - pk-1。


元のリンク: https://blog.csdn.net/weixin_45843077/article/details/108741889

共素数とは何かを見てみましょう。

互いに素な数とは、2 つの数の最大公約数が 1 のみであることを意味します。たとえば、6 と 3 の最大公約数は 3 であり、これらは互いに素数ではありませんが、10 と 9 の最大公約数は 1 であり、これらは互いに素数です。

では、2 つの数値が互いに素であるかどうかを証明する方法は次のとおりです。

ここで使用しているのはユークリッドユークリッド除算法です。

一般的な考え方は次のとおりです。

1 まず、r を a/b で得られる剰余、つまり r = a % b (0≤r

 2 r= 0 の場合、プログラムは終了します; b は最大公約数です。

3 r!= 0 の場合: b を a に代入し、r を b に代入して、最初のステップに戻ります。

int fun(int m,int n)
{
    int mod;
    mod=m%n;
    while(mod!=0)
    {
        a=b;
        b=mod;
        mod=a%b;
    }
    return n;
}

 

次はコードスニペット全体です

​
#include<iostream>
#include<math.h>
#define size 1000
using namespace std;
int zhishu(int n)//判断是否为质数
{
    int flag=0;
    for(int i=2; i<sqrt(n); i++)
    {
        if (n%i==0)
            flag++;
    }
    if(n!=1&&flag==0)
        return 1;//是质数
    else
        return 0;
}
int func(int n)//欧拉函数的实现函数
{
    if(zhishu(n))
        return n-1;
    int sum=0;
    for(int j=1; j<n; j++)//欧几里得算法
    {
        int m=n;
        int i=j;
        int mod;//余数;
        while(i!=0)
        {
            mod=m%i;
            m=i;
            i=mod;
        }
        if(m==1)
            sum++;
    }
    return sum;
}
int main()
{
    long long l,r;
    cin>>l>>r;
    cout<<l*r*func(l)*func(r);
    return 0;
}

​

おすすめ

転載: blog.csdn.net/weixin_46713492/article/details/125495531