1. 程式人生 > >小於等於N的全部整數與N關於gcd(i,N)的那些事

小於等於N的全部整數與N關於gcd(i,N)的那些事

相關 -c 因子 pos easy 介紹 直接 content tracking

相關問題1: 求小於等於N的與N互質的數的和。即∑ i (gcd(i,N)=1, N>=i>0)

依據N的規模能夠有非常多種方法。這裏我介紹一個比較經典的方法

先說下這個結論:假設 gcd(n,i)=1則 gcd(n,n-i)=1 (1<=i<=n)
這個很好理解吧,對於隨意兩個數a,b a%s==0,b%s==0(a>b)

那麽(a-b)%s肯定也是零。

所以呢 gcd(n,i)==1則gcd(n,n-i)必須也為1 假設為s(s!=1)

那麽gcd(n,n-(n-i))肯定也不是1啦
於是問題變的很easy
ANS=N*phi(N)/2
i,n-i總是成對出現,而且和是n
以下的說明能夠讓你消除反復的疑慮
由於:
n=2*i->i=n/2
1.假設n是奇數。那麽n!=2*i,自然也不存在n-i=i和反復計算之說
2.假設n是偶數,n=2*i成立,gcd(n,n/2)必定為n的一個因子,這個因子為1當且僅當n==2
於是對於n>2的偶數,絕對不存在gcd(n,n/2)=1所以更別說什麽反復計算了
對於n==2
ans=2*1/2=1
正好也滿足
所以得到終於公式:
ans=N*phi(N)/2

相關問題2:求gcd(i,N)的和,即∑gcd(i,N) ,(N>=i>0)

最直觀的方法就是求N次gcd加起來,呵呵我開個玩笑的,N略微大一點就沒實用了。以下說說正規的解法吧

設函數g(n) = gcd(i,n) (1<=i<=n),對於隨意給定的i 。

g(1) = 1 ,g(n)=g(m1)*g(m2) (n=m1*m2 且 (m1, m2)= 1)。由積性函數定義,g是積性函數。由詳細數學上的結論,積性函數的和也是積性的。

所以f(n) = ∑gcd(i, n)也是積性函數。n>1時n能夠被唯一分解 n=p1^a1*p2^a2*...*ps^as,因為f(n)是積所以f(n) = f(p1^a1)*f(p2^a2)*...f(pr^ar)。

所以僅僅要求f(pi^ai)就好,假設d是n的一個約數。那麽1<=i<=n中gcd(i,n) = d的個數是phi(n/d),即n/d的歐拉函數

f(pi^ai) = Φ(pi^ai)+pi*Φ(pi^(ai-1))+pi^2*Φ(pi^(ai-2))+...+pi^(ai-1)* Φ(pi)+ pi^ai *Φ(1)

= pi^(ai-1)*(pi-1) + pi*pi^(ai-2)*(pi-1)....+pi^ai

= pi^ai*(1+ai*(1-1/pi))

接下來把各個項乘起來OK


相關問題3:求1到N的全部和N互質的數的乘積對N取模

有這種結論,對於1,2,4,答案為N-1,其余的4的倍數答案為1。質數答案為N-1,其余的若為偶數則除以2後再推斷素因子的個數,奇數則直接推斷,多余一個素因子答案為1。僅僅有一個素因子答案為N-1; 同樣的素因子不反復計數。

小於等於N的全部整數與N關於gcd(i,N)的那些事