因數個數函數與因數和函數
d(n)表示n的因數的個數函數。σ(n)表示n的所有因數的和的函數。
積性
這兩個函數都是積性函數。即gcd(a,b)=1⇒f(ab)=f(a)f(b).
因數個數函數d(n)積性證明思路
對於因數個數函數d(n)只需要用質因數分解的唯一性公式對進行質因數分解,利用簡單的組合數學的知識可以知道d(n)的數學表達式。
當gcd(a,b)=1時,說明a與b分解質因數後沒有公共的素因子。將d(ab),d(a),d(b)分解用數學表達式表達出來容易證明d(ab)=d(a)d(b).
因數和函數σ(n)積性證明思路
這個稍微複雜一丟丟。
gcd(a,b)=1,即它們互質。
通過分解質因數的方法,容易說明:
- a,b集合各取一個因數,它們的乘積一定是ab的因數。
- 容易證明ab的因數一定可以分解爲兩個數的積,一個是a的因數,一個是b的因數。
所以a,b各取一個因數ai,bj,就可以構造一個ab的因數aiaj.上面兩點可以保證了我們不會漏取。
所以,剩下的工作就是說明不會重複即可。
也就是要說明ai1bj1=ai2bj2成立當且僅當i1=i2且j1=j2。
這個只需要利用a,b互質,有gcd(ai,bj)=1。
然後由gcd(ai1,bj2)=1,得到bj2∣bj1.
同理gcd(ai2,bj1)=1,可以得到bj1∣bj2.於是就迅速得到j1=j2.
同理就可以得到i1=i2.
這就說明不可能重複了。於是σ(ab)=i=1∑d(a)j=1∑d(b)(aibj)
之後只需要用求和符號求和化簡即可得到符合積性的結論。
σ(ab)=i=1∑d(a)j=1∑d(b)(aibj)=i=1∑d(a)⎝⎛aij=1∑d(b)bj⎠⎞=i=1∑d(a)(aiσ(b))=σ(b)i=1∑d(a)(ai)=σ(a)σ(b)
說說這兩個函數程序如何求值
對於個數函數,顯然是分解質因數,獲取各個素因子的指數,然後用那個數學表達式算了。
對於因數和函數,如果規模比較小,圖方便的話,自然是暴力枚舉,試除相加即可。
規模稍微大一點,就利用積性了,分成互質的數的乘積,然後分別算每一部分的因數和,最後相乘即可。
如何保證互質,分解質因數後的那個表達式,每個素因子連同指數當作一個數,不就兩兩互質了,而且σ(pk)的還是一個等比數列求和.
d(n)的一個性質——d(n)=x∣a∑y∣b∑[gcd(x,y)=1]
假設我們n=ab,不要求a,b互質。
那麼有d(n)=x∣a∑y∣b∑[gcd(x,y)=1].
怎麼理解
即將n分解成n=ab,然後找有序對(x,y),x,y分別是a,b的因數,並且限制x,y互質。
爲什麼等號成立?
分解質因數,組合數學就知道了。
對於一個數來說,要構造一個因數,就是對分解質因數後的每個質因子選一個指數,有多少種選法就有多少個因數。
不同質因數選指數是獨立的,適用乘法原理;對一個固定的質因子p,假設分解質因數形式裏的指數是k,則構造因數時選取指數的範圍是從0到k共k+1種。
現在我們將n分成a,b分成兩部分了,
下面是個示意圖,每個各自代表一個質數,紅色的是a和b共有的質因子。綠色的是a含有而b不含有的素因子,藍色的是b含有而a不含有的素因子。
我們給素因子選一個指數的時候就是往代表這個素因子的格子裏填一個指數。
只是我們現在不是直接往n分解之後的格子裏填數。而是先分別對a,b的分解後的格子裏填數構造因數x,y.
對於紅色格子,我們限定a,b填數的時候不能同時往同一個格子裏填數。即對於同一個紅色格子,那麼只有以下可能:
- a和b都沒有選,即都填了0
- a選了,填的是1,2,…,ka中的一個;b沒選,即填了0
- b沒選,填了0;a沒選,b選了,1,2,…,kb中的一個
於是a,b和b分開填對於這個紅色格子,一共有1+ka+kb種可能。
而n=ab直接分解往裏面填數字的時候,對於這個紅色格子,能填的範圍剛好是0,1,2,3,…,ka+kb共1+ka+kb種可能。
顯然,做了不能往同一個格子裏填數的限制之後,所有方案是一樣的,如果不做這個限制,就不能保證一樣了。
對於綠色格子和藍色格子,由於是各自獨有的,顯然a,b分別填和n直接分解填的方案數是一樣的。
所以最終方案數是一樣的。
所以,我們只需要a和b分別填指數構造自己的因數x,y,統計填法的方案數即可,只是要保證不能對同一個素因子都填非零的指數即可。
那麼怎麼保證?那麼怎麼保證?那麼怎麼保證?
如果他們選用了相同的素因子p,顯然a構造出的因數x和y構造的因數就含有公約數p,所以只需要保證x,y互質即可。