算个欧拉函数给大家助助兴(米勒拉宾(判断素数)+Pollard_rho(求一个大数的因子 ))

这篇博客讲的很好:

https://www.cnblogs.com/ZERO-/p/9302169.html

题目描述

木南有一天学习了欧拉函数,知道了对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目。那么他定义f(n)为有多少个小于等于n的数可以整除n。

例如f(4)=3。(可以被1,2,4整除)。

那么你可以写个程序计算一下f(n)吗?

输入

输入一个n  n≤1018n\le 10^{18}n≤1018

输出

输出f(n)

输出时每行末尾的多余空格,不影响答案正确性

样例输入复制

999999999999999989

样例输出复制

2
#include			//这应该是求一个数的因子个数。 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const ll NUM=10;//运算次数,Miller_Rabin算法为概率运算,误判率为2^(-NUM);
ll t,f[100];
ll mul_mod(ll a,ll b,ll n)//求a*b%n,由于a和b太大,需要用进位乘法
{a=a%n;b=b%n;ll s=0;while(b){if(b&1)s=(s+a)%n;a=(a<<1)%n;b=b>>1;}return s;
}
ll pow_mod(ll a,ll b,ll n)//求a^b%n
{a=a%n;ll s=1;while(b){if(b&1)s=mul_mod(s,a,n);a=mul_mod(a,a,n);b=b>>1;}return s;
}
bool check(ll a,ll n,ll r,ll s)
{ll ans=pow_mod(a,r,n);ll p=ans;for(ll i=1;i<=s;i++){ans=mul_mod(ans,ans,n);if(ans==1&&p!=1&&p!=n-1)return true;p=ans;}if(ans!=1) return true;return false;
}
bool Miller_Rabin(ll n)//Miller_Rabin算法,判断n是否为素数
{if(n<2) return false;if(n==2) return true;if(!(n&1)) return false;ll r=n-1,s=0;while(!(r&1)){r=r>>1;s++;}for(ll i=0;ix) p=y-x;else p=x-y;d=gcd(p,n);if(d!=1&&d!=n) return d;if(i==k){y=x;k+=k;}}
}
void find(ll n)//找出n的所有因子
{if(Miller_Rabin(n)){f[t++]=n;//保存所有因子。 return;}ll p=n;while(p>=n)p=Pollard_rho(p,rand()%(n-1)+1);//由于p必定为合数,所以通过多次求解必定能求得答案find(p);find(n/p);
}
int main()
{srand(time(NULL));//随机数设定种子ll n;cin>>n;if(n==1){cout<<"1"<q;for(int i=0;i::iterator it;ll ans=1;for(it=q.begin();it!=q.end();it++){int s=it->second;ans*=1+s;				//求因子个数的公式。 }cout<

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部