日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mobius函数计算 定义+代码模板

發布時間:2024/8/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mobius函数计算 定义+代码模板 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Mobius函數定義為,輸入一個正整數N,當N=1時,函數值為1,當N不為1時,首先在稿紙上將它分解質因數,若某質因數的個數大于1,則函數值為0,如N=45,45=3*3*5,3出現了兩次,故函數值為0。若質因數全都不相同,設有p個,則函數值為(-1)的p次方,如78,78=2*3*13,質因數全都不相同,有3個,所以函數值為(-1)的3次方,為-1。

f(n)和g(n)是定義在正整數集合上的兩個函數,若
   則
   反之亦然。
  其中
  μ(d)=1, 若d=偶數個不同素數之積
  μ(d)=(-1)r, 若d=奇數個不同素數之積
  μ(d)=0, 其他 例如: μ( 30) = μ( 2·3·5 ) = (-1)3 μ(12) = μ( 3·22) = 0 對任何素數p,μ(p)=-1

輔助定理

編輯 對于任意正整數n,恒有
   代碼模板:

#include <stdio.h> // 一個數字可以有的最多不同質因數個數 #define MAX_PRIM_FACTOR_AMOUNT 1000 /* Mobius 函數定義為:輸入一個正整數N,當N=1時,函數值為1,當N不為1時,首先在稿紙上將它分解質因數。若某質因數的個數大于1,則函數值為0,如N=45,45=3*3*5,3出現了兩次,故函數值為0。若質因數全都不相同,設有p個,則函數值為(-1)的p次方,如78,78=2*3*13,質因數全都不相同,有3個,所以函數值為(-1)的3次方,為-1。 */ /*功能:求 Mobius 函數的值參數:n 一個正整數 doPrint 是否輸出正整數 n 的質因數分解形式。1:輸出;0:不輸出。 返回: Mobius 函數的值 */ int Mobius(unsigned int n, unsigned int doPrint) {// 用 m 來臨時保存 m 的值。因此 n 的值在運算過程中會被改變。 int m = n; // 用 i 來枚舉 n 的質因數int i;// 數字 n 的不同質因數個數 int primeFactorAmount = 0;// n 的某個質因數 i,出現在 n 中的次數 int countCurrentPrimeFactor = 0;// Mobius 函數的值。初始值為 -3,表示還沒有計算出函數值。 int result = -3;// 記錄所有質因數出現的次數。用于輸出質因數分解形式。 int primFactors[MAX_PRIM_FACTOR_AMOUNT][2]; if(n == 0){// 【1】n==0 的情況,實際是非法的輸入。這里返回 -2。 result = -2;}else if(n == 1){// 【2】n==1 的情況result = 1;}else{for(i=2; i<=n ; i++){countCurrentPrimeFactor = 0;while(n % i == 0){// 從數字 n 中除去質因數 i n /= i;// 統計質因數 i 出現的次數 countCurrentPrimeFactor ++;}if(countCurrentPrimeFactor >= 1){// 數字 i 是數字 n 的質因數 primFactors[primeFactorAmount][0] = i;primFactors[primeFactorAmount][1] = countCurrentPrimeFactor;primeFactorAmount ++;if(countCurrentPrimeFactor > 1){// 【3】 n 的某質因數的個數大于 1 的情況 result = 0;} }}if(result == -3){// 【4】 n 有 p 個不同的質因數,返回 (-1)^p result = (primeFactorAmount%2 ? -1 : 1); } }if(doPrint){// 需要輸出 n 的質因數分解形式if(m <= 1)printf("%d = %d\n", m , m);else{printf("%d = ", m);for(i=0; i<primeFactorAmount; i++){printf("%d", primFactors[i][0]);if(primFactors[i][1] > 1)// 質因數出現多余一次,輸出出現次數。 printf("^%d", primFactors[i][1]);if(i < (primeFactorAmount-1))printf(" * ");}printf("\n");} } return result;} int main(int argc, char *argv[]) {int n;// 輸入 n ,按 ctrl + z 停止輸入 while(scanf("%d",&n) !=EOF){printf("Mobius(%d) = %d\n", n, Mobius(n, 1));} return 0; }

/* 測試數據: 0 1 45 78 12345678測試結果: 0 0 = 0 Mobius(0) = -2 1 1 = 1 Mobius(1) = 1 45 45 = 3^2 * 5 Mobius(45) = 0 78 78 = 2 * 3 * 13 Mobius(78) = -1 12345678 12345678 = 2 * 3^2 * 47 * 14593 Mobius(12345678) = 0 ^Z */

總結

以上是生活随笔為你收集整理的Mobius函数计算 定义+代码模板的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。