相关题目:
http://acm.hdu.edu.cn/showproblem.php?pid=2824 pku 2478(与前n个数互质的个数的求和)
http://acm.hdu.edu.cn/showproblem.php?pid=3508 素因子的积
http://acm.hdu.edu.cn/showproblem.php?pid=2710 题目很简单,就是输出N个数素数因子最大的那一个
http://acm.hdu.edu.cn/showproblem.php?pid=3307 (欧拉 + 推导公式 + gcd)
http://acm.hdu.edu.cn/showproblem.php?pid=1299 (求因子个数)
http://acm.pku.edu.cn/JudgeOnline/problem?id=2480 欧拉求所有因子的和
http://acm.pku.edu.cn/JudgeOnline/problem?id=2407 很水的欧拉
http://acm.hdu.edu.cn/showproblem.php?pid=1787 典型 欧拉函数
http://acm.hdu.edu.cn/showproblem.php?pid=3501 欧拉函数求小于N且与N不互质的正整数之和
在数论中,欧拉定理(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数
,且n,a互素,(a,n) = 1,则 a^φ(n) ≡ 1 (mod n)
推论:对于互质的数a、n,满足a^(φ(n)+1) ≡ a (mod n)
费马定理: a是不能被质数p整除的正整数,则有a^(p-1) ≡ 1 (mod p)
证明这个定理非常简单,由于φ(p) = p-1,代入欧拉定理即可证明。
同样有推论:对于不能被质数p整除的正整数a,有a^p ≡ a (mod p)
若n是质数p的k次幂,φ(n)=p^k-p^(k-1)=(p-1)p^(k-1),因为除了p的倍数外,其他数都跟n互质。
欧拉函数是积性函数——若m,n互质,φ(mn)=φ(m)φ(n)。
特殊性质:当n为奇数时,φ(2n)=φ(n), 证明于上述类似。
欧拉性质:
phi(n) >= sqrt(n / 2) n > 0
n > 6 phi(n) >= sqrt(n)
n 为合数 phi(n) <= n - sqrt(n)
推论一:欧拉函数ψ(N)的值为偶数。
推论二:对于任意素数p有ψ(p)=p-1
推论三:设N为质数P的平方,即N=P×P,则ψ(N)=(P-1)×P。
推论四:设N为质数p的n次方(n≥2)则ψ(N)=N×(1-1/p)
推论五:设N为两个不同质数p,q之积,N=p ×q,则ψ(N)=(p-1)×(q-1)。
推论六:对一切正整数n,有φ(p^n)=[p^(n-1)]*(p-1)
欧拉函数的定义:E(k)=([1,n-1]中与n互质的整数个数). 因为任意正整数都可以唯一表示成如下形式:
k=p1^a1*p2^a2*……*pi^ai;(即分解质因数形式)
可以推出:E(k)=(p1-1)(p2-1)……(pi-1)*(p1^(a1-1))(p2^(a2-1))……(pi^(ai-1))
=k*(p1-1)(p2-1)……(pi-1)/(p1*p2*……pi);
=k*(1-1/p1)*(1-1/p2)....(1-1/pk)
ps:在程序中利用欧拉函数如下性质,可以快速求出欧拉函数的值(a为N的质因素)
若(N%a==0 && (N/a)%a==0) 则有:E(N)=E(N/a)*a;
若(N%a==0 && (N/a)%a!=0) 则有:E(N)=E(N/a)*(a-1);
跟据上面的公式,可以得到关于欧拉函数的递推关系:
假设素数p能整除n,那么
如果p还能整除n / p, PHI(n) = PHI(n / p) * p;
如果p不能整除n / p, PHI(n) = PHI(n / p) * (p - 1);
得数学结论:一个整数的所有因子数等于其每个素因子的个数加一之后的乘积(1+p1)(1+p2)…(1+pn)
因子和: 若 k=p1^a1*p2^a2...*pi^ai F(k) = (p1^0+...+p1^a1)*(p2^0+...+p2^a2)*...*(pi^0 + ... + pi^ai)
,其中p1、p2、...、pn分别为该整数的所有n个素因子P1、P2、...Pn的相应个数。
思想:得到一个整数所有素因子。由素因子的组合构造其所有的因子。
一个整数的素因子还有一个特点,就是超过其平方根值的素因子最多只有一个
结合率 ((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p
((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p
交换率 (a + b) mod p = (b+a) mod p
(a × b) mod p = (b × a) mod p
分配率 ((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p
定理(消去律):如果gcd(c,p) = 1 ,则 ac ≡ bc mod p 可以推出 a ≡ b mod p
(拉格朗日四平方和定理)
每个自然数均可表示成4个平方数之和。3个平方数之和不能表示形式如4k(8n+ 7)的数。 如果在
一个正整数的因数分解式中,没有一个数有形式如4k+3的质数次方,该正整数可以表示成两个平方数
之和。
char mark[10000] = {0};
int prime[1230];
int size = 0;
int phi[10000];
int main () {
int i, j;
/*筛法求素数*/
for (i = 2; i < 10000; i++) {
if (!mark[i]) prime[size++] = i;
for (j = 0; j < size && prime[j] * i < 10000; j++) {
mark[prime[j] * i] = 1;
if (i % prime[j] == 0) break;
}
}
/*求欧拉函数*/
phi[1] = 1;
for (i = 2; i < 10000; i++) {
if (!mark[i]) {
phi[i] = i - 1;
continue;
}
for (j = 0; j < size && prime[j] * prime[j] <= i; j++) {
if (i % prime[j] == 0) {
if (i / prime[j] % prime[j] == 0)
phi[i] = prime[j] * phi[i / prime[j]];
else
phi[i] = (prime[j] - 1) * phi[i / prime[j]];
break;
}
}
}
return 0;
}
从别人那里学到的对求欧拉函数部分的优化,使每个数的欧拉函数只由它的最小素因子求出:
phi[1] = 1;
for (i = 1; i < 10000; i++) {
for (j = 0; j < size && prime[j] * i <= 10000; j++) {
if (i % prime[j] == 0) {
phi[prime[j] * i] = prime[j] * phi[i];
break;
}
else {
phi[prime[j] * i] = phi[i] * (prime[j] - 1);
}
}
}
在实际代码过程可以和搜索质数的"筛子法"相结合, 因为"筛子法"相当于优先找到了每个数的最小质
因子.
const int size = 1000001;
int factor[size]; //factor[n]记录了n的最小质因子
bool visited[size];
int phy[size]; //phy[n]记录了与n互质且小于n的个数.
void getPrime()
{
memset(factor, -1, sizeof(factor));
memset(visited, false, sizeof(visited));
for (int i=2; i<size; i++)
{
if (visited[i])
{
//这部分是递归关系的实现
int k = i/factor[i];
if (k%factor[i] == 0)
{
phy[i] = phy[k]*factor[i];
}else{
phy[i] = phy[k]*(factor[i] - 1);
}
continue;
}
phy[i] = i -1; //i本身是质数, 与i互质的个数为i-1.
for (int j=i+i; j<size; j+=i)
{
visited[j] = true;
if (factor[j] == -1)
{
factor[j] = i; //用i筛的过程, 就找到了每个以i为最小质因子的数.
}
}
}
结合率 ((a+b) mod p + c)mod p = (a + (b+c) mod p) mod p
((a*b) mod p * c)mod p = (a * (b*c) mod p) mod p
交换率 (a + b) mod p = (b+a) mod p
(a × b) mod p = (b × a) mod p
分配率 ((a +b)mod p × c) mod p = ((a × c) mod p + (b × c) mod p) mod p
定理(消去律):如果gcd(c,p) = 1 ,则 ac ≡ bc mod p 可以推出 a ≡ b mod p
(拉格朗日四平方和定理)
每个自然数均可表示成4个平方数之和。3个平方数之和不能表示形式如4k(8n+ 7)的数。 如果在
一个正整数的因数分解式中,没有一个数有形式如4k+3的质数次方,该正整数可以表示成两个平方数
之和。
http://hi.baidu.com/xiehuixb/blog/item/a14cfd3967df1ffbb211c7dc.html
http://menjitianya2007.blog.163.com/blog/#m=0&t=1&c=fks_095074086095082075083085074064093083080066082080095
http://hi.baidu.com/xiehuixb/blog
欧拉函数(转)
最新推荐文章于 2023-07-26 18:26:00 发布