《Mathematica科學計算與程序設計》-CH07_第1頁
《Mathematica科學計算與程序設計》-CH07_第2頁
《Mathematica科學計算與程序設計》-CH07_第3頁
《Mathematica科學計算與程序設計》-CH07_第4頁
《Mathematica科學計算與程序設計》-CH07_第5頁
已閱讀5頁,還剩38頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第七章Mathematica程序設計7.4模塊7.5程序設計實例7.6本章小結Mathematica軟件平臺上用于科學計算的指令和語句統(tǒng)稱為Wolfram語言,Wolfram語言屬于高級計算機語言,也是全球頂級的科學計算語言,是物理學等自然科學研究和數(shù)學與密碼學等信息科學研究的利器。本章將詳細介紹使用Wolfram語言進行程序設計的方法,主要內容包括函數(shù)定義與應用方法、常用程序設計控制語句、模塊定義與調用方法和一些程序設計實例。7.1函數(shù)Wolfram語言中的函數(shù)包括內置函數(shù)、包函數(shù)和自定義函數(shù)三種,其中,內置函數(shù)名以大寫字母開頭,可以直接調用;包函數(shù)是指存儲在Wolfram資源庫中的線上函數(shù),使用時需動態(tài)地裝入函數(shù)所在的包文件;自定義函數(shù)為用戶編寫的函數(shù),可用于擴展內置函數(shù)的功能。Wolfram語言中,函數(shù)的調用方法非常靈活,設函數(shù)名為f,其參數(shù)為x,則基本的調用方法為f[x],即使用中括號將參數(shù)包括其中;另一種更簡潔的方法為f@x或x//f,均等價于f[x]。如果多個函數(shù)f、g和h嵌套調用,基本用法為f[g[h[x]]],也可使用f@g@h@x或x//h//g//f。函數(shù)調用的另一種常見表示為“/@”,例如,f/@x,表示函數(shù)f作用于列表x的每一個元素,因此,f/@{1,2,3}等價于{f[1],f[2],f[3]}。7.1函數(shù)Wolfram語言內置了常用的科學計算相關的函數(shù)。這里以偽隨機數(shù)相關的函數(shù)為例,介紹內置函數(shù)的用法。偽隨機數(shù)相關的常用函數(shù)及其基本用法如表7.1所示。7.1.1內置函數(shù)7.1.1內置函數(shù)7.1.1內置函數(shù)7.1.1內置函數(shù)例7.1偽隨機數(shù)函數(shù)應用舉例(1)生成長度為10的0或1偽隨機序列,并統(tǒng)計其中1的個數(shù),見表7.2序號1。(2)生成長度為12的10至99間的偽隨機整數(shù)序列,見表7.2序號2。(3)生成3×4的偽隨機實數(shù)矩陣,每個元素的取值在1和2之間,見表7.2序號3。(4)生成位于直角坐標系中頂點為(0,0)、(1,0)、(0,3)和(1,3)的矩形內的偽隨機復數(shù)序列,序列長度為20,見表7.2序號4。(5)隨機生成一個小于100的素數(shù),見表7.2序號5。(6)從1至100中隨機選擇10個數(shù)(有重復采樣),見表7.2序號6。(7)從1至100中隨機選擇10個數(shù)(不重復采樣),見表7.2序號7。(8)生成服從正態(tài)分布的10個偽隨機數(shù)序列,見表7.2序號8。(9)給定偽隨機數(shù)種子為20200705,生成長度為10的偽隨機整數(shù)序列,每個元素在10至99間取值,然后,從小至大進行排序。見表7.2序號9。表7.2偽隨機數(shù)函數(shù)典型應用實例表7.2中序號1至8的執(zhí)行結果與時間有關,讀者每次執(zhí)行時得到的結果是不同的,所以,這里不給出這些語句的執(zhí)行結果。但是表7.2中序號9的執(zhí)行結果是不隨時間變化的,執(zhí)行后,變量a的結果一定為列表{81,67,94,51,22,95,65,17,92,41},而排序后的結果為{17,22,41,51,65,67,81,92,94,95}。7.1函數(shù)7.1.1內置函數(shù)7.1函數(shù)Mathematica不但是全球最先進的科學計算軟件,而且也是全球最先進的科學數(shù)據(jù)庫,實時地記錄著全球乃至可觀測宇宙部分的動態(tài)信息,供科研人員參考和使用。Mathematica線上資源特別豐富,其中包含了大量的軟件包,每個軟件包以文件的形式存儲在服務器上。這些軟件包中的函數(shù)稱為包函數(shù),這里以有限域算術包為例介紹包函數(shù)的用法。在線上資源庫中,有限域算術包的名稱為FiniteField,在計算機聯(lián)網的情況下,可在Notebook中調入有限域算術包,即輸入

<<FiniteFields`或Needs["FiniteFields`"]然后,可以使用有限域算術包中的全部函數(shù)。這里重點介紹有限域算術中創(chuàng)建有限域對象的函數(shù),如表7.3所示。7.1.2包函數(shù)7.1函數(shù)函數(shù)是Mathematica程序設計的基本要素。在Mathematica中,程序由函數(shù)組成,而函數(shù)一般以模塊的形式供用戶調用。模塊將在第7.3節(jié)中介紹,這里重點介紹自定義函數(shù)及其用法。由于Mathematica系統(tǒng)內置函數(shù)和包函數(shù)均以大寫字母開頭,因此,自定義函數(shù)盡可能以小寫字母開頭。自定義函數(shù)的格式為:函數(shù)名[參數(shù)1_,參數(shù)2_,…,參數(shù)n_]=表達式。需要注意的是,在參數(shù)表中,每個參數(shù)后有一個下劃線“_”,而表達式中的參數(shù)不再具有下劃線。這里的參數(shù)以所謂的符號或變量的形式出現(xiàn),其對應的實參可以為數(shù)值、列表或函數(shù)名。7.1.3自定義函數(shù)7.2控制語句程序語句的執(zhí)行只有三種方式,即順序、分支和循環(huán)。在Mathematica的Notebook中輸入的計算語句按照順序執(zhí)行的方式執(zhí)行。這里重點介紹分支和循環(huán)控制語句。7.2.1分支控制(1)If[條件,語句組1,語句組2,語句組3]如果條件為邏輯真,則執(zhí)行語句組1;如果條件為邏輯假,則執(zhí)行語句組2;如果條件在邏輯上非真非假,則執(zhí)行語句組3。每個語句組可以包含多個語句,語句間用分號“;”分隔。If語句的其他形式簡化形式有:(i)If[條件,語句組1]當條件為邏輯真時,執(zhí)行語句組1;否則,無操作。(ii)If[條件,,語句組2]當條件為邏輯假時,執(zhí)行語句組2;否則,無操作。注意,這里中間的逗號不可缺少。(iii)If[條件,語句組1,語句組2]當條件為邏輯真時,執(zhí)行語句組1;當條件為邏輯假時,執(zhí)行語句組2。7.2控制語句程序語句的執(zhí)行只有三種方式,即順序、分支和循環(huán)。在Mathematica的Notebook中輸入的計算語句按照順序執(zhí)行的方式執(zhí)行。這里重點介紹分支和循環(huán)控制語句。7.2.1分支控制(2)Switch[表達式,情況1,語句組1,情況2,語句組2,……]如果表達式為情況1,則執(zhí)行語句組1;如果表達式為情況2,則執(zhí)行語句組2。每個語句組可以有多個語句,使用分號“;”分隔。(3)Which[邏輯表達式1,值1,邏輯表達式2,值2,……]Which語句依次計算各個邏輯表達式的值,返回第一個為真的邏輯表達式i對應的值i。(4)條件控制符(“/;”)后面接一個邏輯表達式test當邏輯表達式test為真時,條件控制起作用?,F(xiàn)在,使用分支控制語句實現(xiàn)下述分段函數(shù),7.2控制語句Mathematica提供了三種循環(huán)控制語句,即Do語句、While語句和For語句。這三種語句的語法如表7.10所示。7.2.2循環(huán)控制7.2控制語句Wolfram語言是一種高級程序設計語言,具有高級循環(huán)控制語句,如Table、Array、Nest和NestList等。在大多數(shù)情況下,While、Do和For循環(huán)常被這些高級循環(huán)控制語句替代。這些高級循環(huán)控制語句的語法如表7.12所示。7.2.3高級循環(huán)控制7.2.3高級循環(huán)控制7.2.3高級循環(huán)控制7.2.3高級循環(huán)控制7.3純函數(shù)純函數(shù)又稱純匿名函數(shù)。純函數(shù)的格式有兩種,其一,“Function[函數(shù)體]”;其二,“函數(shù)體&”。這里“函數(shù)體”中,#表示形式參數(shù);當有多個形式參數(shù)時,#1表示第一個形式參數(shù),#2表示第二個形式參數(shù),依此類推。在第一種情況下,還可以指定形式參數(shù),如Function[形式參數(shù)列表,函數(shù)體]。下面列舉幾個典型語句,如表7.14所示。7.3純函數(shù)純函數(shù)一個重要的作用體現(xiàn)在表7.14序號7的應用中。Wolfram語言的基本數(shù)據(jù)結構為列表,而借助于純函數(shù)可以把函數(shù)作用施加到列表的各個元素。注意,有些函數(shù)具有Listable屬性(例如,Sin函數(shù),使用“??Sin”可查看Sin函數(shù)的屬性),這類函數(shù)作用于列表時,將作用于列表的每個元素。例如,Sin[{0,Pi/2,Pi,3Pi/2,2Pi}]將返回{0,1,0,-1,0}。7.4模塊在Wolfram語言中,模塊是程序的基本單位,模塊對應著程序設計實現(xiàn)的子功能,類似于C語言中的函數(shù)。常用的模塊有四種,即With、Block、Module和Compile。這里借助于Hénon映射生成偽隨機序列為例,介紹模塊的應用方法。Hénon映射是一種二維離散混沌,其吸引子的方程為

其中,a=1.4,b=0.3。給定初始值x0和y0,生成指定長度的偽隨機序列,序列的每個元素為0至255間取值的整數(shù)。With語句的基本語法為With[初始化變量列表,語句組]7.4.1With模塊7.4.1With模塊其中,“語句組”可包含多個語句,各個語句間用分號“;”分隔?!罢Z句組”中使用的變量可以為全局變量,也可以為“初始化變量列表”中的變量。如果“語句組”中使用了“初始化變量列表”中的變量,這些變量的初始值直接代入語句組中。特別注意:“初始化變量列表”中的變量均為With語句內部可見的局部變量。With語句的典型實例如表7.15所示。With語句的基本語法為With[初始化變量列表,語句組]7.4.1With模塊With語句的處理速度比第7.4.3節(jié)將要介紹的Module語句快。With語句的典型用法如表7.15的序號3所示。注意:在With模塊中出現(xiàn)的非“初始化變量列表”中的變量均為全局變量。借助于With語句使用Hénon映射生成偽隨機序列的程序如下:henon:={#[[2]],1.0-1.4#[[2]]^2+0.3#[[1]]}&;f[x0_,y0_,m_]:=With[{x1=x0,y1=y0,m1=m},dat1=NestList[henon,{x1,y1},m1];dat2=Flatten[dat1][[3;;-1;;2]];dat3=Mod[Floor[(2+dat2)*10^6],256]]f[0.3,0.23,30]上述代碼中,定義了兩個函數(shù)henon和f,其中,henon使用純函數(shù)定義;函數(shù)f具有三個參數(shù)x0、y0和m,x0和y0作為Hénon映射的迭代初值,m為生成的偽隨機序列的長度。調用f[0.3,0.23,30]的執(zhí)行結果如下:{240,4,204,52,14,106,206,79,232,189,113,50,255,186,203,163,254,170,182,123,147,207,33,81,174,249,115,33,211,113}需要特別注意的是,在函數(shù)f的定義中,dat1、dat2和dat3在函數(shù)f被調用后,將成為Notebook中的全局變量。但是大多數(shù)情況下,只希望函數(shù)返回值,并不產生任何全局變量。Block和Module模塊可實現(xiàn)這種變量局部化的要求。7.4模塊類似于With模塊,Block模塊可以直接使用全局變量,并可以生成全局變量。而全局變量的存在破壞了算法的模塊化,因此,Block模塊還實現(xiàn)了全部變量局部化方法。Block語句的語法為:

Block[局部變量列表,語句組]或Block[局部變量初始化列表,語句組]這里的“語句組”可包含多條語句,各條語句間用分號“;”分隔,語句組的最后一條語句的執(zhí)行結果為返回值。Block語句的典型用法實例如表7.16所示。7.4.2Block模塊借助于Block語句使用Hénon映射生成偽隨機序列的程序如下:henon:={#[[2]],1.0-1.4#[[2]]^2+0.3#[[1]]}&;f[x0_,y0_,m_]:=Block[{x1=x0,y1=y0,m1=m,dat1,dat2,dat3},dat1=NestList[henon,{x1,y1},m1];dat2=Flatten[dat1][[3;;-1;;2]];dat3=Mod[Floor[(2+dat2)*10^6],256]]f[0.3,0.23,30]上述代碼中,先定義了henon函數(shù)和f函數(shù),在f函數(shù)中使用了Block語句,將Block語句中使用了變量均定義為局部變量,運行結果由“語句組”的最后一條語句返回。執(zhí)行函數(shù)“f[0.3,0.23,30]”返回:{240,4,204,52,14,106,206,79,232,189,113,50,255,186,203,163,254,170,182,123,147,207,33,81,174,249,115,33,211,113}在使用Block模塊時,如果“語句組”中的表達式包含了局部變量,將使用局部變量定義的初始值,這種方式稱為動態(tài)計算“語句組”中的表達式(這是和Module模塊唯一的區(qū)別,下文的Module模塊是“靜態(tài)”處理的)。例如:y=x^2+2x+1Block[{x=a},x+y]返回1+3a+a^2。而Module[{x=a},x+y]返回1+a+2x+x^2。7.4.2Block模塊7.4模塊在絕大多數(shù)情況下,使用Module語句實現(xiàn)模塊的功能,最主要的原因,可能是因為“Module”英文有“模塊”的含義。由7.4.2節(jié)可知,當全部使用局部變量時,Block模塊與Module模塊完全通用,事實上,Wolfram語言中Block模塊的處理速度比Module模塊更快。Module語句的語法如下:

Module[局部變量列表,語句組]或Module[局部變量初始化列表,語句組]這里的“語句組”可包含多條語句,各條語句間用分號“;”分隔,語句組的最后一條語句的執(zhí)行結果為返回值。Module語句的典型用法實例如表7.17所示。7.4.3Module模塊由Module語句使用Hénon映射生成偽隨機序列的程序如下Clear["`*"]henon:={#[[2]],1.0-1.4#[[2]]^2+0.3#[[1]]}&;f[x0_,y0_,m_]:=Module[{x1=x0,y1=y0,m1=m,dat1,dat2,dat3},dat1=NestList[henon,{x1,y1},m1];dat2=Flatten[dat1][[3;;-1;;2]];dat3=Mod[Floor[(2+dat2)*10^6],256];{dat1[[2;;-1]],dat3}]{ps1,ps2}=f[0.7,0.13,3000]上述程序代碼首先定義了henon函數(shù)和f函數(shù),f函數(shù)的參數(shù)x0和y0為Hénon映射的迭代初值,m設定產生的混沌偽隨機序列的長度。函數(shù)f的返回值為列表{dat1[[2;;-1]],dat3},列表中有兩個元素dat1[[2;;-1]]和dat3,依次為Hénon映射的狀態(tài)值序列和偽隨機序列。執(zhí)行“{ps1,ps2}=f[0.7,0.13,3000]”獲得長度為3000的狀態(tài)序列和偽隨機序列。下面使用ps1借助于ListPlot[Reverse/@ps1,AxesLabel->{"x","y"},AspectRatio->Automatic,ImageSize->Large]繪制Hénon映射的相圖如下:建議在Module模塊中全部使用局部變量,并將Module模塊定義為函數(shù)的實現(xiàn)部分。由Module語句使用Hénon映射生成偽隨機序列的程序如下7.4模塊Mathematica軟件使用C語言實現(xiàn)的,用戶編寫的Mathematica程序是順序調用Mathematica系統(tǒng)函數(shù)實現(xiàn)的。一般地,用戶程序的執(zhí)行效率遠遠低于C語言可執(zhí)行程序。為了提高Mathematica用戶程序的執(zhí)行效率,可以使用Compile模塊,設計經過編譯的用戶函數(shù)。這種編譯后的函數(shù)的執(zhí)行效率非常接近于C語言可執(zhí)行程序的效率,但是這類函數(shù)只能使用常規(guī)的數(shù)據(jù)類型,即整型(_Integer)、浮點型(_Real)、復數(shù)類型(_Complex)和邏輯變量(True或False),使用的列表必須為數(shù)值型數(shù)組??梢姡m然Compile模塊可以編譯為機器代碼,極大地提高了執(zhí)行速度,但是遠沒有Module模塊靈活。7.4.4Compile模塊Compile模塊的典型語法為Compile[{{變量名1,變量類型1},{變量名2,變量類型2},…},語句組]或Compile[{{變量名1,變量類型1},{變量名2,變量類型2},…},語句組,屬性]或Compile[{{變量名1,變量類型1,變量1維數(shù)},{變量名2,變量類型2,變量2維數(shù)},…},語句組]上述語法中,“語句組”可以包含多條語句,各條語句間用分號“;”隔開。Compile模塊的典型用法實例如表7.18所示。由Complile語句使用Hénon映射生成偽隨機序列的程序如下:Clear["`*"]henon:={#[[2]],1.0-1.4#[[2]]^2+0.3#[[1]]}&;f=Compile[{{x0,_Real},{y0,_Real},{m,_Integer}},Module[{x1=x0,y1=y0,m1=m,dat1,dat2,dat3},dat1=NestList[henon,{x1,y1},m1];dat2=Flatten[dat1][[3;;-1;;2]];dat3=Mod[Floor[(2+dat2)*10^6],256]]]ps=f[0.3,0.23,30]返回值為:{240,4,204,52,14,106,206,79,232,189,113,50,255,186,203,163,254,170,182,123,147,207,33,81,174,249,115,33,211,113}。上述程序中在Compile模塊內部嵌入了Module模塊。Compile模塊的最大用處在于可以借助于Compile模塊比較不同算法的運算速度,Compile模塊本質上是機器語言程序,可以準確地反映算法的運行速度。本節(jié)以兩個常用的對稱密碼算法(RC4和SM4)為例,介紹Mathematica程序設計方法。這里使用了Module模塊作為程序設計基本單元。對于加密算法而言,輸入為明文和密鑰,輸出為密文;對于解密算法而言,輸入為密文和密鑰,輸出為明文。RC4是一種常用的流密碼,而SM4是我國的一項文本加密標準。7.5程序設計實例7.5.1RC4加密原理與實現(xiàn)RC4密碼,全稱為“RivestCipher4”,是一種典型的分組密鑰,習慣上稱之為流密碼,因為RC4可用于互聯(lián)網中的實時數(shù)據(jù)傳輸。RC4的密鑰長度可為1至256個字節(jié),建議實際保密通信應用中使用128字節(jié)以上的密鑰。這里,設p表示明文,k表示密鑰,c表示密文,均為基于字節(jié)的向量。結合表7.6可知,對于RC4加密過程,輸入為密鑰k和長度為n個字節(jié)的明文p,輸出為長度為n個字節(jié)的密文c。具體的加密步驟如下:(1)密碼流初始化第1步:將密鑰k擴展為長度為256字節(jié)的key。設密鑰k的長度為m個字節(jié),則key[i++]=k[(i++)modm],i=0,1,2,…,255(7.4)第2步:初始化長度為256字節(jié)的數(shù)組sbox,即sbox=[0,1,2,…,255]。第3步:循環(huán)變量i從0至255,循環(huán)執(zhí)行以下兩條語句:(i)j=(j+sbox[i]+key[i])mod256RC4加密過程如圖7-6所示(ii)互換sbox[i]與sbox[j]的值。經過上述3步得到的sbox稱為初始密碼流。(2)加密算法已知明文p的長度為n。初始化變量i=0、j=0。變量u從0至n-1,循環(huán)執(zhí)行以下語句:(i)i=(i++)mod256;(ii)j=(j+sbox[i])mod256;(iii)互換sbox[i]與sbox[j]的值;(iv)t=(sbox[i]+sbox[j])mod256;(v)c[u]=sbox[t]異或p[u]。最后得到的c即為密文。RC4加密過程如圖7-6所示需要注意的是RC4密碼不是一次一密算法,使用RC4密碼的通信雙方在“密碼流初始化”之后,將隨著圖7-6中k的增加持續(xù)加密過程。RC4可能的不安全性在于密碼流的重復(或循環(huán)再現(xiàn))。因此,RC4密碼不宜長期使用,在使用一段時間(加密了足夠長的數(shù)據(jù))后,應借助于公鑰技術替換RC4密碼的密鑰k。此外,RC4不宜加密大量的重復性內容,這種情況下即使密碼流是變化的,仍然有信息泄露的危險。RC4密碼的解密過程與加密過程相似,除了有兩點不同:(1)輸入為密鑰k和密文c,輸出為還原后的明文p;(2)圖7-6中有灰色填充的方框中的內容由原來的“c[u]=sbox[t]異或p[u]”變?yōu)椤皃[u]=sbox[t]異或c[u]”。現(xiàn)在,借助于Mathematica軟件實現(xiàn)RC4算法。首先,設密鑰k為71個字節(jié)長的字符串:“Donotforonerepulsegiveupthepurposethatyouresolvedtoeffect.”(僅作為示例,選自莎士比亞先生的名言,由于這個密鑰中存在大量重復的字符(包括空格),這并不是一個優(yōu)秀的密鑰)。然后,設明文p取為莎士比亞先生的另一段名言:“Ignoranceisthecurseofnature,knowledgethewingwherewithweflytoheaven.”(長80個字節(jié))。7.5程序設計實例7.5.2SM4加密原理與實現(xiàn)商用密碼SM4是我國的一項文本數(shù)據(jù)加密標準,輸入密鑰長度為128比特,輸入的明文長度為128比特,輸出的密文長度也為128比特。如果用SM4加密長文本,需要使用CBC(密文分組鏈接)模式。SM4和DES(數(shù)據(jù)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論