欧拉定理

Deadly 提交于 2019-11-29 04:57:32

一. 分解质因数

  每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,把一个合数用质因数相乘的形式表示出来,叫做分解质因数。如30=2×3×5 。分解质因数只针对合数。求一个数的质因数,要从最小的质数除起,一直除到结果为质数为止。分解质因数的算式叫短除法,和除法的性质相似,还可以用来求多个数的公因式。(百科)

const int MAXN = 100010;
int prime[MAXN] = {0};
bool isprime[MAXN] = {0};
int id = 0;
void getPrime() //素数筛法
{
    for (int i = 2; i < MAXN; i++)
    {
        if (!isprime[i])
            prime[id++] = i;
        for (int j = 0; j < id && i * prime[j] <= MAXN && i * prime[j] != 0; j++)
            isprime[i * prime[j]] = 1;
    }
}
void getPrimeFactor(int n) //分解质因数,递归输出素因子
{
    getPrime();
    if (n < 2)
        return;
    if (!isprime[n])
        cout << n;
    else
    {
        for (int i = 0; prime[i] < n; i++)
            if (n % prime[i] == 0)
            {
                cout << prime[i] << " ";
                getPrimeFactor(n / prime[i]);
                break;
            }
    }
}

 

二. 欧拉函数

  对正整数n,欧拉函数是小于或等于n的正整数中与n互质的数的数目。根据定义可以写出

int gcd(int a, int b)
{
    return b ? gcd(b, a % b) : a;
}
int getfi(int n)
{
    int fi = 0;
    for (int i = 1; i < n; i++)
        if (gcd(i, n) == 1)
            fi++;
    return fi;
}

  根据欧拉函数通式

      

  可以写出

int ksm(int a, int b)//快速幂
{
    int res = 1;
    for (; b; b >>= 1, a *= a)
        if (b & 1)
            res *= a;
    return res;
}
int getfi(int n)
{
    int fi = 1;
    getPrime();
    if (n == 1 || !isprime[n])
        return 1;
    for (int i = 0; prime[i] < n; i++)
        if (n % prime[i] == 0)
        {
            int cnt = 0;
            while (n % prime[i] == 0)
            {
                cnt++;
                n /= prime[i];
            }
            fi *= (prime[i] - 1) * ksm(prime[i], cnt - 1);
        }
    return fi;
}

  欧拉函数通式可根据算数基本定理证明:

 

三. 欧拉定理

  欧拉定理描述:

  

  扩展欧拉定理:

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!