; 由于筛法从i=2开始进行,所有phi[i]元素值初始全为0。
1)phi[2]=0,2在筛子中,2是质数,开始执行筛法过程,对指定范围内所有2的倍数进行处理。
phi[2]=0 phi[2]=2 (置初始值表示筛掉 ) phi[2]=phi[2]*(2-1)/2 =1 (由于2是其质因数,按公式需 *(1-1/2) )
phi[4]=0 phi[4]=4 (置初始值表示筛掉 ) phi[4]=phi[4]*(2-1)/2 = 2 ( 由于2是其质因数,按公式需 *(1-1/2) )
phi[6]=0 phi[6]=6 phi[6]=phi[6]*(2-1)/2 = 3
……
phi[30]=0 phi[30]=30 phi[30]=phi[30]*(2-1)/2 = 15
2)i++进行下一次循环。i=3,phi[3]=0,3在筛子中,3是质数,开始执行筛法过程,对指定范围内所有3的倍数进行处理。
phi[3]=0 phi[3]=3 (置初始值表示筛掉 ) phi[3]=phi[3]*(3-1)/3 =2 (3是其质因数,按公式需 *(1-1/3) )
phi[6]=3 不等于0,已筛过,不再置初始值,直接phi[6]=phi[6]*(3-1)/3 =2 (3是其质因数,按公式需 *(1-1/3) )
phi[9]=0 phi[9]=9 (置初始值表示筛掉 ) phi[9]=phi[9]*(3-1)/3 =6 (3是其质因数,按公式需 *(1-1/3) )
……
phi[30]=15 phi[30]=phi[30]*(3-1)/3 = 10
3)i++进行下一次循环,i=4,phi[4]=2,4不在筛子中,4不是质数,不进行处理。
4)i++进行下一次循环。i=5,phi[5]=0,5在筛子中,5是质数,开始执行筛法过程,对指定范围内所有5的倍数进行处理。
phi[5]=0 phi[5]=5 (置初始值表示筛掉 ) phi[5]=phi[5]*(5-1)/5 =4 (5是其质因数,按公式需 *(1-1/5) )
phi[10]=5 不等于0,已筛过,直接 phi[10]=phi[10]*(5-1)/5 =4 (5是其质因数,按公式需 *(1-1/5) )
……
phi[30]=10 phi[30]=phi[30]*(5-1)/5 = 8
根据上面的描述,可以将这个筛法过程写成如下的二重循环。
for (i=2; i <= n; i++)
{
if (phi[i]==0) // i在筛子中,是质数
for (j = i; j <= n; j+=i) // 处理i的倍数
{
if (phi[j]==0) // 在筛子中,筛掉
phi[j] = j;
phi[j] = phi[j]/i*(i-1);
}
}
【例3】欧拉函数的应用。