窮舉法

窮舉法

窮舉法的基本思想是根據題目的部分條件確定答案的大致範圍,並在此範圍內對所有可能的情況逐一驗證,直到全部情況驗證完畢。若某個情況驗證符合題目的全部條件,則為本問題的一個解;若全部情況驗證後都不符合題目的全部條件,則本題無解。窮舉法也稱為枚舉法。

基本信息,破譯方法,概述,編程,對策,

基本信息

用窮舉法解題時,就是按照某種方式列舉問題答案的過程。針對問題的數據類型而言,常用的列舉方法一有如下三種:
(1)順序列舉 是指答案範圍內的各種情況很容易與自然數對應甚至就是自然數,可以按自然數的變化順序去列舉。
(2)排列列舉 有時答案的數據形式是一組數的排列,列舉出所有答案所在範圍內的排列,為排列列舉。
(3)組合列舉 當答案的數據形式為一些元素的組合時,往往需要用組合列舉。組合是無序的。
例子如下:在公元五世紀我國數學家張丘建在其《算經》一書中提出了“百雞問題 ”:
“雞翁一值錢5,雞母一值錢3,雞雛三值錢1。百錢買百雞,問雞翁、母、雛各幾何?”這個數學問題的數學方程可列出如下:
Cock+Hen+Chick=100
Cock*5+Hen*3+Chick/3=100
顯然這是個不定方程,適用於窮舉法求解。依次取Cock值域中的一個值,然後求其他兩個數,滿足條件就是解。
該問題的C語言程式算法如下:
int Cock,Hen,Chick; /*定義公雞,母雞,雞雛三個變數*/
Cock=0;
while (Cock<=19) /*公雞最多不可能大於19*/
{ Hen=0;
whlie (Hen<=33) /*母雞最多不可能大於33*/
{Chick=100-Cock-Hen;
if (Cock*15+Hen*9+Chick==300)/*為了方便,將數量放大三倍比較*/
printf("\n公雞=%d\n母雞=%d\n雛雞=%d",Cock,Hen,Chick);
Hen=Hen+1;
}
Cock=Cock+1;
}

破譯方法

概述

窮舉法是一種針對於密碼的破譯方法。這種方法很像數學上的“完全歸納法”並在密碼破譯方面得到了廣泛的套用。簡單來說就是將密碼進行逐個推算直到找出真正的密碼為止。比如一個四位並且全部由數字組成其密碼共有10000種組合,也就是說最多我們會嘗試9999次才能找到真正的密碼。利用這種方法我們可以運用計算機來進行逐個推算,也就是說用我們破解任何一個密碼也都只是一個時間問題。
當然如果破譯一個有8位而且有可能擁有大小寫字母、數字、以及符號的密碼用普通的家用電腦可能會用掉幾個月甚至更多的時間去計算,其組合方法可能有幾千萬億種組合。這樣長的時間顯然是不能接受的。其解決辦法就是運用字典,所謂“字典”就是給密碼鎖定某個範圍,比如英文單詞以及生日的數字組合等,所有的英文單詞不過10萬個左右這樣可以大大縮小密碼範圍,很大程度上縮短了破譯時間。
在一些領域,為了提高密碼的破譯效率而專門為其製造的超級計算機也不在少數,例如IBM美國軍方製造的“颶風”就是很有代表性的一個。

編程

可以用c語言編程實現窮舉法。例如:
使用窮舉法列出100以內的素數
#include<stdio.h>
int main()
{
int n,i;
for(n=2;n<=100;n++)
{
for(i=2;i<n;i++)
{
if(n%i==0) break;
}
if(i>=n)
printf("%d\t",n);
}
}
顯示結果為2,3,5,7,11,13,17,19,23,29,31,37,,41,47,53,59,61,67,71,73,83,89,97.

對策

現今稍具嚴密度的密碼驗證機制都會設下試誤的可容許次數以應對使用密碼窮舉法的破解者。當試誤次數達到可容許次數時,密碼驗證系統會自動拒絕繼續驗證,有的甚至還會自動啟動入侵警報機制。

相關詞條

熱門詞條

聯絡我們