求一个数的质因子以及欧拉函数

本文深入探讨了质因数分解算法及其实现,并解释了如何利用筛法计算欧拉函数,提供了代码实例及应用定理解析。

求一个数的质因子

代码:

#include<stdio.h>
int main()
{
    long long a[100],num,i,n;
    while(~scanf("%I64d",&n))
    {
        num=0;
        for(i=2; i*i<=n; i++)
        {
            if(n%i==0)
                a[num++]=i;
            while(n%i==0)
                n/=i;
        }
        if(n>1)
            a[num++]=n;
        for(i=0; i<num; i++)
            printf("%I64d ",a[i]);
        printf("\n");
    }

    return 0;
}
#include<stdio.h>
#include<string.h>
long long a[1000000];
int main()
{
    long long i,j,n;
    scanf("%I64d",&n);
    memset(a,0,sizeof(a));
    for(i=2; i<100000; i++)
        if(!a[i])
            for(j=2*i; j<=n; j+=i)
                a[j]=1;

    for(i=2; i<=n; i++)
    {
        if(!a[i]&&n%i==0)
            printf("%I64d ",i);

    }
    return 0;
}
第二个是我直接筛法写的,但是这样子的时间复杂度好像有点高,

定理:

算术基本定理,又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。例如:
 
算术基本定理的内容由两部分构成:
分解的存在性;
分解的唯一性,即若不考虑排列的顺序,正整数分解为素数乘积的方式是唯一的。
看过百度后感觉是好了一点,下面该欧拉函数了。

欧拉函数,就是求出不大于n且与n互素的数的个数

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    int n,i,m;
    while(~scanf("%d",&n))
    {
        if(n==1)
            printf("0\n");
        else
        {
            m=sqrt(n+0.5);
            int ans=n;
            for(i=2; i<=m; i++)
                if(n%i==0)
                {
                    ans=ans/i*(i-1);
                    while(n%i==0)
                        n/=i;

                }
            if(n>1)
                ans=ans/n*(n-1);
            printf("%d\n",ans);

        }

    }
    return 0;
}
这个其实就是求一个数的质因数的变形(只不过是加了一点内容)就是欧拉函数的一个公式。

公式:

利用欧拉函数和它本身不同质因数的关系,用 筛法计算出某个范围内所有数的欧拉函数值。
欧拉函数和它本身不同质因数的关系:
欧拉函数ψ(N)=N{∏p|N}(1-1/p)
 
亦即:
   
(P是数N的 质因数
直接代入公式就好了,对了,这一点,它还使用了一个开方向下取整的小细节,请教大神,说在1e9内都是没有问题的,这个我也没有求证,以后求证过了再补,( m=sqrt(n+0.5))还有容斥原理,有时间再写吧。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值