欧拉在 C 中的 totient 函数
Euler's totient function in C
对于自然数n,欧拉总函数定义为集合{1,...n}
中与n
互质的自然数的个数。我必须用 C 语言编写一个程序,以便输入 n
输出是 n
的欧拉总函数。
这是我的尝试:
#include<stdio.h>
int main(void) {
int n,k;
scanf("%d", &n);
for (k=1; k<n; k++) {
if(n%k !=0)
printf("%d\n", k);
}
return 0;
}
后来我意识到这也应该给我 1
作为每个 n
的输出,所以我想我可以在 return 0
之前添加这个:
if(k=1) printf("1");
但这看起来不太好...我怎样才能更智能地编写这个程序?
Euler 的 totient 函数计算给定整数 n 内与 n 互质的正整数 link
您可以计算相对质数或互质数,如下所示:
int coprime(int a, int b)
{
while(b)
{
a %= b;
//swap a & b
int temp = a;
a = b;
b = temp;
}
return a;
}
计算欧拉的 Totient 为:
int phi(int n)
{
int result = 0;
int k;
for(k = 1; k <= n; k++)
result += coprime(k, n) == 1;
return result;
}
测试:
int main()
{
int i;
for(i = 1; i < 10; i++)
printf("%d %d\n", i, phi(i));
return 0;
}
结果(与other结果比较)
1 1
2 1
3 2
4 2
5 4
6 2
7 6
8 4
9 6
对于自然数n,欧拉总函数定义为集合{1,...n}
中与n
互质的自然数的个数。我必须用 C 语言编写一个程序,以便输入 n
输出是 n
的欧拉总函数。
这是我的尝试:
#include<stdio.h>
int main(void) {
int n,k;
scanf("%d", &n);
for (k=1; k<n; k++) {
if(n%k !=0)
printf("%d\n", k);
}
return 0;
}
后来我意识到这也应该给我 1
作为每个 n
的输出,所以我想我可以在 return 0
之前添加这个:
if(k=1) printf("1");
但这看起来不太好...我怎样才能更智能地编写这个程序?
Euler 的 totient 函数计算给定整数 n 内与 n 互质的正整数 link
您可以计算相对质数或互质数,如下所示:
int coprime(int a, int b)
{
while(b)
{
a %= b;
//swap a & b
int temp = a;
a = b;
b = temp;
}
return a;
}
计算欧拉的 Totient 为:
int phi(int n)
{
int result = 0;
int k;
for(k = 1; k <= n; k++)
result += coprime(k, n) == 1;
return result;
}
测试:
int main()
{
int i;
for(i = 1; i < 10; i++)
printf("%d %d\n", i, phi(i));
return 0;
}
结果(与other结果比较)
1 1 2 1 3 2 4 2 5 4 6 2 7 6 8 4 9 6