数学实验第二次 加密解密特征值与迭代
- 格式:ppt
- 大小:477.50 KB
- 文档页数:32
数学实验题目4 Newton 迭代法摘要0x 为初始猜测,则由递推关系产生逼近解*x 的迭代序列{}k x ,这个递推公式就是Newton 法。
当0x 距*x 较近时,{}k x 很快收敛于*x 。
但当0x 选择不当时,会导致{}k x 发散。
故我们事先规定迭代的最多次数。
若超过这个次数,还不收敛,则停止迭代另选初值。
前言利用牛顿迭代法求的根程序设计流程问题1(1 程序运行如下:r = NewtSolveOne('fun1_1',pi/4,1e-6,1e-4,10) r = 0.7391(2 程序运行如下:r = NewtSolveOne('fun1_2',0.6,1e-6,1e-4,10) r = 0.5885问题2(1 程序运行如下:否 是否是是定义()f x输入012,,,x N εε开 始1k =01()f x ε<0100()()f x x x f x =-'102||x x ε-<k N =输出迭代失败标志输出1x输出奇 异标志结 束01x x = 1k k =+ 否r = NewtSolveOne('fun2_1',0.5,1e-6,1e-4,10)r = 0.5671(2)程序运行如下:r = NewtSolveOne('fun2_2',0.5,1e-6,1e-4,20)r = 0.5669问题3(1)程序运行如下:①p = LegendreIter(2)p = 1.0000 0 -0.3333p = LegendreIter(3)p = 1.0000 0 -0.6000 0p = LegendreIter(4)p =1.0000 0 -0.8571 0 0.0857p = LegendreIter(5)p = 1.0000 0 -1.1111 0 0.2381 0②p = LegendreIter(6)p = 1.0000 0 -1.3636 0 0.4545 0 -0.0216r = roots(p)'r= -0.932469514203150 -0.6612 0.9324695142031530.6612 -0.238619186083197 0.238619186083197用二分法求根为:r = BinSolve('LegendreP6',-1,1,1e-6)r = -0.932470204878826 -0.661212531887755 -0.2386200573979590.2386 0.661192602040816 0.932467713647959(2)程序运行如下:①p = ChebyshevIter(2)p = 1.0000 0 -0.5000p = ChebyshevIter(3)p = 1.0000 0 -0.7500 0p = ChebyshevIter(4)p = 1.0000 0 -1.0000 0 0.1250p = ChebyshevIter(5)p = 1.0000 0 -1.2500 0 0.3125 0②p = ChebyshevIter(6)p = 1.0000 0 -1.5000 0 0.5625 0 -0.0313r = roots(p)'r = -0.965925826289067 -0.7548 0.9659258262890680.7547 -0.258819045102521 0.258819045102521用二分法求根为:r = BinSolve('ChebyshevT6',-1,1,1e-6)r = -0.965929926658163 -0.7755 -0.2588289221938780.2588 0.7020 0.965924944196429与下列代码结果基本一致,只是元素顺序稍有不同:j = 0:5;x = cos((2*j+1)*pi/2/(5+1))x =0.965925826289068 0.7548 0.258819045102521-0.258819045102521 -0.7547 -0.965925826289068(3)程序运行如下:①p = LaguerreIter(2)p = 1 -4 2p = LaguerreIter(3)p = 1 -9 18 -6p = LaguerreIter(4)p = 1 -16 72 -96 24p = LaguerreIter(5)p =1.0000 -25.0000 200.0000 -600.0000 600.0000 -120.000②p = LaguerreIter(5)p =1.0000 -25.0000 200.0000 -600.0000 600.0000 -120.000r = roots(p)'r =12.6432 7.8891 3.5964257710407111.4520 0.263560319718141用二分法求根为:r = BinSolve('LaguerreL5',0,13,1e-6)r = 0.263560314567722 1.4789 3.5964257656311507.0720 12.6490(4)程序运行如下:①p = HermiteIter(2)p = 1.0000 0 -0.5000p = HermiteIter(3)p = 1.0000 0 -1.5000 0p = HermiteIter(4)p = 1.0000 0 -3.0000 0 0.7500p = HermiteIter(5)p = 1.0000 0 -5.0000 0 3.7500 0②p = HermiteIter(6)p = 1.0000 0 -7.5000 0 11.2500 0 -1.8750r = roots(p)'r =-2.3587 2.3588 -1.3358490740136961.335849074013698 -0.4367 0.4366用二分法求根为:r = BinSolve('HermiteH6',-3,3,1e-6)r =-2.3516 -1.335849********* -0.43630.4366 1.335848983453244 2.3504所用到的函数function r = NewtSolveOne(fun, x0, ftol, dftol, maxit)% NewtSolveOne 用Newton法解方程f(x)=0在x0附近的一个根%% Synopsis: r = NewtSolveOne(fun, x0)% r = NewtSolveOne(fun, x0, ftol, dftol)%% Input: fun = (string) 需要求根的函数及其导数% x0 = 猜测根,Newton法迭代初始值% ftol = (optional)误差,默认为5e-9% dftol = (optional)导数容忍最小值,小于它表明Newton法失败,默认为5e-9 % maxit = (optional)迭代次数,默认为25%% Output: r = 在寻根区间内的根或奇点if nargin < 3ftol = 5e-9;endif nargin < 4dftol = 5e-9;endif nargin < 5maxit = 25;endx = x0; %设置初始迭代位置为x0k = 0; %初始化迭代次数为0while k <= maxitk = k + 1;[f,dfdx] = feval(fun,x); %fun返回f(x)和f'(x)的值if abs(dfdx) < dftol %如果导数小于dftol,Newton法失败,返回空值r = [];warning('dfdx is too small!');return;enddx = f/dfdx; %x(n+1) = x(n) - f( x(n) )/f'( x(n) ),这里设dx = f( x(n) )/f'( x(n) )x = x - dx;if abs(f) < ftol %如果误差小于ftol,返回当前x为根r = x;return;endendr = []; %如果牛顿法未收敛,返回空值function p = LegendreIter(n)% LegendreIter 用递推的方法计算n次勒让德多项式的系数向量Pn+2(x) = (2*i+3)/(i+2) * x*Pn+1(x) - (i+1)/(i+2) * Pn(x)%% Synopsis: p = LegendreIter(n)%% Input: n = 勒让德多项式的次数%% Output: p = n次勒让德多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %P0(x) = 1p = 1;return;elseif n == 1 %P1(x) = xp = [1 0];return;endpBk = 1; %初始化三项递推公式后项为P0pMid = [1 0]; %初始化三项递推公式中项为P1for i = 0:n-2pMidCal = zeros(1,i+3); %构造用于计算的x*Pn+1pMidCal(1:i+2) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的PnpBkCal(3:i+3) = pBk;pFwd = (2*i+3)/(i+2) * pMidCal - (i+1)/(i+2) * pBkCal; %勒让德多项式三项递推公式Pn+2(x) = (2*i+3)/(i+2) * x*Pn+1(x) - (i+1)/(i+2) * Pn(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把勒让德多项式最高次项系数归一化function p = ChebyshevIter(n)% ChebyshevIter 用递推的方法计算n次勒让德-切比雪夫多项式的系数向量Tn+2(x) = 2*x*Tn+1(x) - Tn(x)%% Synopsis: p = ChebyshevIter(n)%% Input: n = 勒让德-切比雪夫多项式的次数%% Output: p = n次勒让德-切比雪夫多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %T0(x) = 1p = 1;return;elseif n == 1 %T1(x) = xp = [1 0];return;endpBk = 1; %初始化三项递推公式后项为T0pMid = [1 0]; %初始化三项递推公式中项为T1for i = 0:n-2pMidCal = zeros(1,i+3); %构造用于计算的x*Tn+1pMidCal(1:i+2) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的PnpBkCal(3:i+3) = pBk;pFwd = 2*pMidCal - pBkCal; %勒让德-切比雪夫多项式三项递推公式Tn+2(x) = 2*x*Tn+1(x) - Tn(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把勒让德-切比雪夫多项式最高次项系数归一化function p = LaguerreIter(n)% LaguerreIter 用递推的方法计算n次拉盖尔多项式的系数向量Ln+2(x) = (2*n+3-x)*Ln+1(x) - (n+1)*Ln(x)%% Synopsis: p = LaguerreIter(n)%% Input: n = 拉盖尔多项式的次数%% Output: p = n次拉盖尔多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %L0(x) = 1p = 1;return;elseif n == 1 %L1(x) = -x+1p = [-1 1];return;endpBk = 1; %初始化三项递推公式后项为L0pMid = [-1 1]; %初始化三项递推公式中项为L1for i = 0:n-2pMidCal1 = zeros(1,i+3); %构造用于计算的x*Ln+1(x)pMidCal1(1:i+2) = pMid;pMidCal2 = zeros(1,i+3); %构造用于计算的Ln+1(x)pMidCal2(2:i+3) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的Ln(x)pBkCal(3:i+3) = pBk;pFwd =( (2*i+3)*pMidCal2 - pMidCal1 - (i+1)*pBkCal )/ (i+2); %拉盖尔多项式三项递推公式Ln+2(x) = (2*n+3-x)*Ln+1(x) - (n+1)^2*Ln(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把拉盖尔多项式最高次项系数归一化function p = HermiteIter(n)% HermiteIter 用递推的方法计算n次埃尔米特多项式的系数向量Hn+2(x) = 2*x*Hn+1(x) - 2*(n+1)*Hn(x)%% Synopsis: p = HermiteIter(n)%% Input: n = 埃尔米特多项式的次数%% Output: p = n次埃尔米特多项式的系数向量if round(n) ~= n | n < 0error('n必须是一个非负整数');endif n == 0 %H0(x) = 1p = 1;return;elseif n == 1 %H1(x) = 2*xp = [2 0];return;endpBk = 1; %初始化三项递推公式后项为L0pMid = [2 0]; %初始化三项递推公式中项为L1for i = 0:n-2pMidCal = zeros(1,i+3); %构造用于计算的x*Hn+1(x)pMidCal(1:i+2) = pMid;pBkCal = zeros(1,i+3); %构造用于计算的Hn(x)pBkCal(3:i+3) = pBk;pFwd =2*pMidCal - 2*(i+1)*pBkCal; %埃尔米特多项式三项递推公式Hn+2(x) = 2*x*Hn+1(x) - 2*(n+1)*Hn(x)pBk = pMid; %把中项变为后项进行下次迭代pMid = pFwd; %把前项变为中项进行下次迭代endp = pFwd/pFwd(1); %把拉盖尔多项式最高次项系数归一化function r = BinSolve(fun, a, b, tol)% BinSolve 用二分法解方程f(x)=0在区间[a,b]的根%% Synopsis: r = BinSolve(fun, a, b)% r = BinSolve(fun, a, b, tol)%% Input: fun = (string) 需要求根的函数% a,b = 寻根区间上下限% tol = (optional)误差,默认为5e-9%% Output: r = 在寻根区间内的根if nargin < 4tol = 5e-9;endXb = RootBracket(fun, a, b); %粗略寻找含根区间[m,n] = size(Xb);r = [];nr = 1; %初始化找到的根的个数为1maxit = 50; %最大二分迭代次数为50for i = 1:ma = Xb(i,1); %初始化第i个寻根区间下限b = Xb(i,2); %初始化第i个寻根区间上限err = 1; %初始化误差k = 0;while k < maxitfa = feval(fun, a); %计算下限函数值fb = feval(fun, b); %计算上限函数值m = (a+b)/2;fm = feval(fun, m);err = abs(fm);if sign(fm) == sign(fb) %若中点处与右端点函数值同号,右端点赋值为中点b = m;else %若中点处与左端点函数值同号或为0,左端点赋值为中点a = m;endif err < tol %如果在a处函数值小于tolr(nr) = a; %一般奇点不符合该条件,这样可以去除奇点nr = nr + 1; %找到根的个数递增k = maxit; %改变k值跳出循环endk = k + 1; %二分迭代次数递增endendfunction X = powerX(x,a,b)% powerX 对给定向量(x1, x2,..., xn)返回增幂矩阵(x1^a, x2^a,..., xn^a; x1^a+1, x2^a+1,..., xn^a+1; ...; x1^b, x2^b,..., xn^b;)%% Synopsis: X = powerX(x,a,b)%% Input: x = 需要返回增幂矩阵的向量% a,b = 寻根区间上下限%% Output: X = 增幂矩阵(x1^a, x2^a,..., xn^a; x1^a+1, x2^a+1,..., xn^a+1; ...; x1^b, x2^b,..., xn^b;)if round(a) ~= a | round(b) ~= berror('a,b must be integers');elseif a >= berror('a must be smaller than b!');endx = x(:)';row = b-a+1;col = length(x);X = zeros(row, col);for i = b:-1:aX(b-i+1,:) = x.^i;Endfunction [f, dfdx] = fun1_1(x)f = cos(x) - x;dfdx = -sin(x) - 1;function [f, dfdx] = fun1_2(x)f = exp(-x) - sin(x);dfdx = -exp(-x) - cos(x);function [f, dfdx] = fun2_1(x)f = x - exp(-x);dfdx = 1 + exp(-x);function [f, dfdx] = fun2_2(x)f = x.^2 - 2*x*exp(-x) + exp(-2*x);dfdx = 2*x - 2*exp(-x) + 2*x*exp(-x) - 2*exp(-2*x);function y = LegendreP6(x)p = LegendreIter(6);X = powerX(x,0,6);y = p*X;function y = ChebyshevT6(x)p = ChebyshevIter(6);X = powerX(x,0,6);y = p*X;function y = LaguerreL5(x)p = LaguerreIter(5);X = powerX(x,0,5);y = p*X;function y = HermiteH6(x)p = HermiteIter(6);X = powerX(x,0,6);y = p*X;思考题(1)由于Newton法具有局部收敛性,所以在实际问题中,当实际问题本身能提供接近于根的初始近似值时,就可保证迭代序列收敛,但当初值难以确定时,迭代序列就不一定收敛。
数值实验1.1 迭代法的设计和运行(1)一、实验目的迭代法是解各种方程和方程组的基本方法,它通过构造一个定常的迭代格式,重复计算而产生一个收敛的解的序列,逐步逼近问题的真解。
对于同一个问题,常可设计不同的迭代格式,这些格式的计算效果可能相差很大,对初始值选择的要求不同,收敛速度也不同。
本实验的目的有两个。
1、选取相同的初值,采用不同的迭代格式,判断不同收敛格式的收敛性及其收敛快慢及精度。
2、对于某个选定的迭代格式,选取不同的初值,分析迭代结果关于初值的依赖关系及不同初值对收敛速度和精度的影响。
二、实验步骤及结果1、选取相同初值,采用不同的迭代格式,判别收敛性 迭代格式:①231104k k k k x x x x +=+--; ②1k x +=;③1k x +=为了比较不同迭代格式对不同初值的依赖关系,选择1 1.1x =和1 1.3x =进行比较。
2.1.1、选取初值1 1.1x =时的结果图2.1 初值1 1.1x =,迭代格式231104k kk k x x x x +=+--计算结果图2.2初值1 1.1x =,迭代格式1k x +=计算结果图2.3初值1 1.1x =,迭代格式1k x +=比较三种结果可以看出,迭代格式1是不收敛的,而且当7k =时就已经超出了计算机的计算范围;而迭代格式2和3都是收敛的,但是两种格式最终的收敛值是不同的,格式2收敛于0.15815,格式3收敛于1.3652;从图上可看出,格式2和3的收敛速度在初值为1 1.1x =时事相近的。
2.1.2、选取初值1 1.3x =时的结果图2.4初值1 1.3x =,迭代格式231104k kk k x x x x +=+--计算结果图2.5初值1 1.3x =,迭代格式1k x +=计算结果图2.6初值1 1.3x =,迭代格式1k x +=比较三幅图和计算得到的数据,可以看出,取不同初值对最后的计算结果和收敛性都没有显著影响。
二次特征值反问题的数值解法及其应用代数特征值反问题的理论与方法是研究结构动力模型修正问题的主要方法之一。
目前,如何同时保持结构矩阵的半正定性与稀疏性是结构动力模型修正问题中的一个重要研究课题。
本文主要运用交替方向法与邻近点方法,研究了二次特征值反问题,并讨论了这些方法在阻尼振动系统、无阻尼陀螺结构系统的有限元模型修正中的应用,为代数特征值反问题以及有限元动力模型修正问题提供数学理论和有效的数值方法。
本文主要包括如下内容:当质量矩阵为对角矩阵且足够精确或固定时,基于不完备特征数据,考虑了首一二次特征值反问题(MQIEP),要求修正的刚度矩阵、阻尼矩阵的对称性、半正定性和稀疏性与初始系统保持一致。
首先,利用约束条件的特殊结构,讨论了MQIEP有解的条件。
然后,将邻近点方法与交替方向法结合,提出了一种求解MQIEP的乘子交替方向法,并给出该方法的收敛性分析。
最后,将乘子交替方向法应用于带阻尼振动系统的有限元模型修正问题,实验结果表明该方法是可行的。
基于不完备特征数据,考虑了结构化二次特征值反问题(SQIEP),要求修正的质量矩阵、阻尼矩阵与刚度矩阵的对称性、半正定性和稀疏性与初始系统保持一致。
首先,讨论了SQIEP有解的条件。
然后,利用拉格朗日函数,给出SQIEP的单调变分不等式形式,提出了求解该不等式问题的定制邻近点算法,并给出该算法的收敛性分析。
最后,将该算法应用于阻尼振动系统的有限元模型修正问题,实验结果表明该方法是可行的。
基于不完备特征数据,考虑了无阻尼陀螺结构系统的结构化二次特征值反问题(GQIEP),要求修正的质量矩阵、陀螺矩阵与刚度矩阵的对称性、反对称性、半正定性以及稀疏性与初始系统保持一致。
首先,讨论了GQIEP有解的条件。
然后利用约束条件的特殊结构,给出了求解GQIEP的定制邻近点算法,并给出该算法的收敛性分析。
实验结果表明该算法是可行的。
清华大学高等数值分析课程作业第二次实验 作业第一题:构造例子特征值全部在右半平面时,观察基本的Arnoldi 方法和GMRES 方法的数值性态,和相应重新启动算法的收敛性。
答:1、计算初始条件1) 矩阵A 的生成根据实Schur 分解,构造矩阵如下形式11112222/2/2/2/2n nA n n n n ⨯-⎛⎫ ⎪ ⎪ ⎪- ⎪= ⎪ ⎪ ⎪- ⎪⎪⎝⎭其中,A 由n/2个块形成,每个对角块具有如下形式,对应一对特征向量i i i αβ+ii i i A αββα-⎛⎫= ⎪⎝⎭、 这里,取n=1000,得到矩阵A 。
经过验证,A 的特征值分布均在右半平面,如下图所示50100150200250300350400450500-500-400-300-200-1000100200300400500复平面中A 的特征值分布情况实部 Im(x)虚部 R e (x )特征值2) b 的初值为 b=(1,1,1,1..1)T 3) 迭代初值为 x 0=0 4) 停机准则为 ε=10-62、基本的Arnoldi 和GMRES 方法代入前面提到的初始值A 、b 、x0,得到的收敛结果如下10020030040050060010-710-610-510-410-310-210-110两种基本算法的||r k ||收敛曲线 (阶数n=1000)迭代次数||r k ||/||b ||基本的Arnoldi 算法基本的GMRES 算法结果讨论:从图中可以看出,基本的Arnoldi 方法经过554步收敛,基本的GMRES 方法经过535步收敛。
这是由于GMRES 具有残差最优性,会略快于Arnoldi 方法,但是,由于两种方法的基本原理近似,GMRES 方法不会实质性的提速。
此外,从收敛曲线上看,由于特征值均处在右半平面,收敛曲线平滑,收敛速度(收敛因子)比较均匀。
3、重启动的GMRES 和Arnoldi 算法对上述A 、b 、x0使用重启动的Arnoldi 和GMRES 算法。
西京学院数学软件实验任务书实验四实验报告一、实验名称:线性方程组的J-迭代,GS-迭代,SOR-迭代。
二、实验目的:熟悉线性方程组的J-迭代,GS-迭代,SOR-迭代,SSOR-迭代方法,编程实现雅可比方法和高斯-赛德尔方法求解非线性方程组12123123521064182514x x x x x x x x +=⎧⎪++=⎨⎪++=-⎩的根,提高matlab 编程能力。
三、实验要求:已知线性方程矩阵,利用迭代思想编程求解线性方程组的解。
四、实验原理:1、雅可比迭代法(J-迭代法):线性方程组b X A =*,可以转变为:迭代公式(0)(1)()k 0,1,2,....k k J XXB X f +⎧⎪⎨=+=⎪⎩ 其中b M f U L M A M I B J 111),(---=+=-=,称J B 为求解b X A =*的雅可比迭代法的迭代矩阵。
以下给出雅可比迭代的分量计算公式,令),....,()()(2)(1)(k n k k k X X X X =,由雅可比迭代公式有b XU L MXk k ++=+)()1()(,既有i ni j k i iji j k iij k iij b X aXa X a +--=∑∑+=-=+1)(11)()1(,于是,解b X A =*的雅可比迭代法的计算公式为⎪⎩⎪⎨⎧--==∑∑-=+=+)(1),....,(111)()()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k iTn X a X a b a X X X X X 2、 高斯-赛德尔迭代法(GS-迭代法):GS-迭代法可以看作是雅可比迭代法的一种改进,给出了迭代公式:⎪⎩⎪⎨⎧--==∑∑-=+=+++)(1),....,(111)1()1()1()0()0(2)0(1)0(i j n i j k j ij k j ij i ii k iTn X a X a b a X X X X X 其余部分与雅克比迭代类似。
实验二:迭代法、初始值与收敛性 一:实验要求 考虑一个简单的代数方程 210,x x --= 针对上述方程,可以构造多种迭代法,如211111,1,n n n n n x x x x x +++=-=+
=代做实验,记录各算法的迭代过程。 二:实验要求及实验结果 (1) 取定某个初始值,按如上迭代格式进行计算,它们的收敛性如何?重复选取不同放入初始值,反复实验。请读者
自行设计一种比较形象的记录方式(如何利用Matlab 的图形功能),分析三种迭代法的收敛性与初值的选取关系。
(2) 对三个迭代法中的某一个,取不同的初值进行迭代,结果如何?试分析对不同的初值是否有差异?
实验内容: ⅰ)对211n n x x +=-进行迭代运算,选取迭代次数n=20;分别选择初值-0.6, 1.6进行实验,并画出迭代结果的趋势图。
编写MATLAB 运算程序如下: %迭代法求解 %令x=x^2-1 clear n=30; x=-0.5; x1=x^2-1; for i=1:n x1=x1^2-1; xx(i)=x1; end m=linspace(0,29,n); plot(m,xx) title('x=-0.5') x=-0.6 x=1.6 如上图所示,选取初值分别为-0.6、1.6时,结果都是不收敛的。 分析:2()1n g x x =-,'()2g x x =,要想在某一邻域上'()21,[1,1]g x x x =
存在某个邻域使得该迭代公式收敛。即迭代公式对任何初值都是发散的。 ⅱ)对111n n x x +=+ 进行迭代运算,选取迭代次数n=30;分别选择初值=-0.7, 2.1进行实验,并画出迭代结果的趋势图。
编写MATLAB 运算程序如下: %迭代法求解 %令x=x^2-1 clear n=20; x=-0.5; x1=1+1./x; for i=1:n x1=1+1./x1; xx(i)=x1; end m=linspace(0,29,n); plot(m,xx,'b') title('x=-0.5') x=-0.7 x=2.1 如上图所示,选取初值分别为-0.7、2.1时,结果都是收敛。 分析:1()1,n g x x =+设 '21()[1.65,],[1.65,],()g x x g x x ∈+∞?∈+∞=-在[1.65,]+∞上有界,且'2
问题1:编译hill2中若加入空格如何考虑hill的加密和解密过程?加密与解密过程的模型如下:加密器解密器明文密文明文(1):加密过程:1):根据明文字母的表值讲明文信息用数字表示。
即明文信息用26个大写字母和空格表示。
并与1~26、0之间一一对应的字母的表值如下:2):选择一个二阶可逆矩阵A,即为hill2的加密矩阵(密钥)。
3):讲明文字母依次逐对分组。
因为Hill2密码的加密矩阵为二阶矩阵。
则讲明文字母2个分为一组。
若最后一组只有一个字母,则补充一个没有实际意义的哑字母,这样使得每一组都有两个明文字母组成。
根据字母表的对应关系可以讲明文构成一个二维向量ɑ。
4):用密钥即可逆矩阵乘以ɑ得到ɡ向量。
即ɡ=Aɑ,可以得到一个新的二维列向量,然后进行模27运算,可以得到一个新的二位列向量。
然后查找字母表值,既可以得到明文的密文。
(2):解密过程:解密过程主要是求加密矩阵的逆矩阵。
将密文也对组分。
得到一个二位列向量有知道当矩阵为可逆矩阵应满足的条件是det~=0。
然后在模27下进行模的运算。
即破译过程:前面的加密与解密类似于在二维列向量空间进行线性变换。
每一个明文向量是一个二维列向量,乘以加密矩阵后仍为一个二维列向量,由于加密矩阵A为可逆矩阵,所以如果知道两个线性无关的两位明文向量与其对应的密文就可以求出加密矩阵A和A-。
即模27逆矩阵A-(mod 27)=|A|-(mod 27)*A*(mod 27).这将逆矩阵A-(mod 27)左乘密文向量然后再做一次模27运算及可得到明文。
问题 2:以自己的姓名为原文,学号的后四位作为密钥求加密后的密文(含有空格)。
以LIU QIU YAN 为原文。
可逆矩阵A为加密矩阵的密钥, A=[2,1;0,7] 。
将原文LIU QIU YAN分组可得:LI U QI U YA NN由字母表值可得到对应二维列向量为:12 9 21179212511414然后分别左乘加密矩阵A得到一组新的二位列向量:33 63 424363425174298作模27的运算可的到有一个新的二位列向量:6 9 15169152471517根据字母表的对应关系可得到密文为FIO PIO XGO问题3:推广位hill3的情况。