快速求n的质因子

质因子(或质因数)在数论里是指能整除给定正整数质数。根据算术基本定理,不考虑排列顺序的情况下,每个正整数都能够以唯一的方式表示成它的质因数的乘积。两个没有共同质因子的正整数称为互质。因为1没有质因子,1与任何正整数(包括1本身)都是互质。只有一个质因子的正整数为质数,质数的质因子就是它本身。

将一个正整数表示成质因数乘积的过程和得到的表示结果叫做质因数分解。显示质因数分解结果时,如果其中某个质因数出现了不止一次,可以用幂次的形式表示。例如360的质因数分解是:

其中的质因数2、3、5在360的质因数分解中的幂次分别是3,2,1。

数论中的不少函数与正整数的质因子有关,比如取值为n的质因数个数的函数和取值为n的质因数之和的函数。它们都是加性函数,但并非完全加性函数。

例子

  • 1没有质因子。

  • 5只有1个质因子,5本身。(5是质数。)

  • 6的质因子是2和3。(6 = 2×3)

  • 2、4、8、16等只有1个质因子:2(2是质数,4 = 22,8 = 23,如此类推。)

  • 100有2个质因子:2和5。(100 = 2^2×5^2)

    性质

  • 两个没有共同质因子的正整数称为互质

  • 数字1与任何正整数(包括1 本身)都是互质。

  • 正整数的因数分解给出一连串的质因子;所有质因子相乘后。质因子如重复会以指数表示。

  • 根据Fundamental theorem of arithmetic(算术基本定理),任正整数有独一无二的质因子分解式

  • 设任正整数n,其质因子数目及其质因子的和是n的算术函数(arithmetic function)。

  • 例子 6的质因子是3和2。(6 = 3 × 2)

  • 5只有1个质因子,5本身。(5是质数。)

  • 10有2个质因子:2和5。(10 = 2 x 5, 且10=5 x 2,只有2和5是质数)

  • 2、4、8、16等只有1个质因子:2(2是质数,4 =2x 2,8 =2x 4,如此类推。偶数(6除外)的因子中,只有2是质数。)

  • 1没有质因子。(1是empty product)

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cstdio>
    #include<vector>
    using namespace std;
    const int mod=1e9+7;
    typedef long long ll;
    ll fac[1010];
    void findFactor(ll x)//求x的质因子
    {
        ll s=x;
        fac[0]=0;//表示质因子的个数
        for(ll i=2;i*i<=s;i++)
        {
            if(x%i==0)
            {
                fac[++fac[0]]=i;
                while(x%i==0)
                    x/=i;
            }
        }
         if(x>1)    fac[++fac[0]]=x;
    }
    ll phi(ll x)//求x的欧拉函数值
    {
        ll res=x;
        for(ll i=2;i*i<=x;i++)
        {
            if(x%i==0){
                res=res/i*(i-1);
                while(x%i==0)   x/=i;
            }
        }
        if(x>1) res=res/x*(x-1);
        return res;
    }
    int main()
    {
        ll a,b;
        findFactor(150);
        for(int i=1;i<=fac[0];i++)
            printf("%lld\n",fac[i]);
        printf("%lld\n",phi(150));
    }
    

猜你喜欢

转载自blog.csdn.net/qq_40507857/article/details/82788443