唯一分解定理

2021-06-03 14:46:00 字數 3592 閱讀 1491

任意乙個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,乙個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。

c++#include

#include

#include

using namespace std;

int main()

;int num[32] = ;

int local = 0;

unsigned short try_num = 2;

while (try_num*try_num <= n)//若n小於4,則用此**時,需要特判

if (flag)

try_num++;

}int k = 0;

while (prime[k])

else

k++;

}if (n != 1)

cout <

system("pause");

return 0;

} pscal

var prime,num:array[0..32]of longint;

n,try_num,local,flag:longint;

procedure init;

begin

readln(n);

fillchar(prime,sizeof(prime),0);

fillchar(num,sizeof(num),0);

local:=0;try_num:=2;flag:=0;

end;

procedure main;

var k:longint;

begin

while try_num*try_num<=n do

begin

while n mod try_num=0 do

begin

prime[local]:=try_num;

inc(num[local]);

n:=n div try_num;

flag:=1;

end;

if flag=1 then

begin

inc(local);

flag:=0;

end;

inc(try_num);

end;

k:=0;

while prime[k]<>0 do

begin

if prime[k+1]<>0 then

begin

if num[k]>1 then

write(prime[k],'^',num[k],'*')

else write(prime[k],'*');

endelse

begin

if num[k]>1 then

write(prime[k],'^',num[k])

else write(prime[k]);

end;

inc(k);

end;

if n<>1 then

writeln('*',n);

end;

begin

assign(input,'1.in');reset(input);

assign(output,'1.out');rewrite(output);

init;

main;

close(input);close(output);

end.

歡迎提出 更快的解決方案

下面的是

**matrix 67的部落格:

現在的問題是,為什麼質因數分解的方法是唯一的。這個結論是如此的顯然和易於接受,以致於有人會脫口而出:這當然是唯一的,不斷使用越來越大的質數去試除,最後得到的肯定是唯一的質因數分解。不可否認,這個演算法本身是沒有任何問題的。根據合數的定義,試除與分解是一定能不斷進行下去的,除非被除數本身變成了乙個質數,而此時也標誌著演算法的結束。問題的關鍵就在於,這並不能說明原數能唯一地表示成質數的乘積:換一種試除的順序會不會得出不同的分解方法?萬一還有什麼別的牛b**也能用來分解質因數,而且結果與上面得到的完全不一樣咋辦?上面給出的演算法只能說明我們能找出至少一種分解質因數的方法,用這種方法得到的結果是唯一的,但到底還有沒有其它偏方秘籍能匯出另外的分解方法來,我們就不得而知了。為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們有至少兩種分解方法。那麼根據上文提到的「非空正整數集裡存在最小的元素」,一定有乙個最小的數m,它能用至少兩種方法表示成質數的乘積:

m = p1 * p2 * ... * pr = q1 * q2 * ... * qs

下面我們將看到,這種假設會推出乙個多麼荒謬的結果來。不妨設p1 <= p2 <= ... <= pr, q1 <= q2 <= ... <= qs。顯然,p1是不等於q1的,不然兩邊同時約掉它,我們就得到乙個更小的有兩種分解方法的數。不妨設p1 < q1,那麼我們用p1替換掉等式最右邊中的q1,得到乙個比m更小的數t = p1 * q2 * q3 * ... * qs。令m' = m - t,我們得到m'的兩種表達:

m' = (p1 * p2 * ... * pr) - (p1 * q2 * ... * qs) = p1 * (p2 * .. * pr - q2 * ... * qs)   ……   (1)

m' = (q1 * q2 * ... * qs) - (p1 * q2 * ... * qs) = (q1 - p1) * q2 * ... * qs   ………………   (2)

由於t比m小,因此m'是正整數。從(1)式中我們立即看到,p1是m'的乙個質因子。注意到m'比m小,因此它的質因數分解方式應該是唯一的,可知p1也應該出現在表示式(2)中。既然p1比所有的q都要小,因此它不可能恰好是(2)式中的某個q,於是只可能被包含在因子(q1-p1)裡。但這就意味著,(q1-p1)/p1除得盡,也就是說q1/p1-1是乙個整數,這樣q1/p1也必須得是整數。我們立即看出,p1必須也是q1的乙個因子,這與q1是質數矛盾了。這說明,我們最初的假設是錯誤的。

唯一分解定理的乙個重要的推論是,如果質數p是ab的因子,那麼p或者是a的因子,或者是b的因子。我們剛才在證明過程中也不自覺地用到了這個推論。證明方法很簡單,假如a和b裡面都不含p,把a和b各自分解開來再乘到一起,我們就得到了數ab的乙個沒有因子p的分解方式;而按照前面提到的試除法,ab是可以表示成p與另一些質數的乘積的,這違背了唯一分解定理。連續多次使用該推論,我們可以很快將推論推廣到多個數的情形。

事實上,假設這個推論成立,我們也能很快反過來推出唯一分解定理:寫出n的兩種質因數分解,在前一種分解中任取乙個因子,它必然會在後一種分解方法中出現;把它們約掉之後結論繼續適用,不斷進行該操作直到最終兩邊都只餘下乙個1。這一系列操作說明了,兩種分解方法實際上是相同的。我們看到,唯一分解定理和它的推論實際上是等價的。如果我們能夠繞過唯一分解定理,用另一種方法證出這個推論,我們也就相當於找到了唯一分解定理的另乙個證明。而事實上,運用擴充套件的輾轉相除演算法,我們可以飛快地完成推論的證明。我們將說明,如果質數p能整除ab,但不整除a,那它一定是b的約數。

質數p不能整除a,告訴我們a和p互質,於是存在整數k和l使得ka + lp = 1。等式兩邊同時乘以b,我們有kab + lpb = b。而ab能被p整除,也即存在整數r使得ab=pr。那麼,kpr + lpb = p(kr + lb) = b,我們立即看出p是b的乙個約數。

唯一分解定理

唯一分解定律 又稱為正整數的唯一分解定理,即 每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。當題目有大數相除,求餘數時,精度要求高時.就要運用唯一分解定律 以下唯一分解定律證明 為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們...

唯一分解定理

problem description 假設x是乙個正整數,它的值不超過65535 即1 x 65535 請編寫乙個程式,將x分解為若干個素數的乘積。input 輸入的第一行含乙個正整數k 1 k 10 表示測試例的個數,後面緊接著k行,每行對應乙個測試例,包含乙個正整數x。output 每個測試例...

唯一分解定理

唯一分解定理 任何乙個大於1的自然數n,如果n不是質數,那麼n可以分解成有限個素數的乘積 例 n p1 a1 p2 a2 p3 a3 其中p1在做 uva10375 時學到了這個演算法,雖然自己理解的還不透徹,先把自己的看法寫下來,日後再完善 要用唯一分解定理第一步當然是素數打表了 之前素數打表一直...