如何解这个拉格朗日乘法数乘法得到的方程

  拉格朗日乘法乘数法(Lagrange Multiplier Method)之湔听数学老师授课的时候就是一知半解现在越发感觉拉格朗日乘法乘数法应用的广泛性,所以特意抽时间学习了麻省理工学院的在线数學课程新学到的知识一定要立刻记录下来,希望对各位博友有些许帮助

1. 拉格朗日乘法乘数法的基本思想

  作为一种优化算法,拉格朗日乘法乘子法主要用于解决约束优化问题它的基本思想就是通过引入拉格朗日乘法乘子来将含有n个变量和k个约束条件的约束优化问题轉化为含有(n+k)个变量的无约束优化问题。拉格朗日乘法乘子背后的数学意义是其为约束方程梯度线性组合中每个向量的系数

  如何將一个含有n个变量和k个约束条件的约束优化问题转化为含有(n+k)个变量的无约束优化问题?拉格朗日乘法乘数法从数学意义入手通过引叺拉格朗日乘法乘子建立极值条件,对n个变量分别求偏导对应了n个方程然后加上k个约束条件(对应k个拉格朗日乘法乘子)一起构成包含叻(n+k)变量的(n+k)个方程的方程组问题,这样就能根据求方程组的方法对其进行求解

  解决的问题模型为约束优化问题:

  首先,峩们先以麻省理工学院数学课程的一个实例来作为介绍拉格朗日乘法乘数法的引子

  【麻省理工学院数学课程实例】求双曲线xy=3上离远點最近的点。

  首先我们根据问题的描述来提炼出问题对应的数学模型,即:

  min f(x,y)=x2+y2(两点之间的欧氏距离应该还要进行开方但是这並不影响最终的结果,所以进行了简化去掉了平方)

  根据上式我们可以知道这是一个典型的约束优化问题,其实我们在解这个问题時最简单的解法就是通过约束条件将其中的一个变量用另外一个变量进行替换然后代入优化的函数就可以求出极值。我们在这里为了引絀拉格朗日乘法乘数法所以我们采用拉格朗日乘法乘数法的思想进行求解。

  我们将x2+y2=c的曲线族画出来如下图所示,当曲线族中的圆與xy=3曲线进行相切时切点到原点的距离最短。也就是说当f(x,y)=c的等高线和双曲线g(x,y)相切时,我们可以得到上述优化问题的一个极值(注意:如果不进一步计算在这里我们并不知道是极大值还是极小值)。

  现在原问题可以转化为求当f(x,y)和g(x,y)相切时x,y的值是多少?

  如果两个曲線相切那么它们的切线相同,即法向量是相互平行的▽f//▽g.

  由▽f//▽g可以得到,▽f=λ*▽g

  这时,我们将原有的约束优化问题转化為了一种对偶的无约束的优化问题如下所示:

  无约束方程组问题

  通过求解右边的方程组我们可以获取原问题的解,即

  通过举上述这个简单的例子就是为了体会拉格朗日乘法乘数法的思想即通过引入拉格朗日乘法乘子(λ)将原来的约束优化问题转化为无约束的方程組问题。

3. 拉格朗日乘法乘数法的基本形态

   求函数在满足下的条件极值可以转化为函数的无条件极值问题。

  我们可以画图来辅助思考

  绿线标出的是约束g(x,y)=c的点的轨迹。蓝线是f(x,y)的等高线箭头表示斜率,和等高线的法线平行

  从图上可以直观地看到在最优解處,f和g的斜率平行

  一旦求出λ的值,将其套入下式,易求在无约束极值和极值所对应的点。

  新方程F(x,y)在达到极值时与f(x,y)相等因为F(x,y)达箌极值时g(x,y)?c总等于零。

  上述式子取得极小值时其导数为0即▽f(x)+▽∑λigi(x)=0,也就是说f(x)和g(x)的梯度共线

  求这个椭球的内接长方体的最大體积。这个问题实际上就是条件极值问题即在条件   

  当然这个问题实际可以先根据条件消去,然后带入转化为无条件极值问题来处理但是有时候这样做很困难,甚至是做不到的这时候就需要用拉格朗日乘法乘数法了。通过拉格朗日乘法乘数法将问题转化为

  联立湔面三个方程得到和带入第四个方程解之

  带入解得最大体积为

  拉格朗日乘法乘数法对一般多元函数在多个附加条件下的条件极徝问题也适用。

  题目:求离散分布的最大熵

  分析:因为离散分布的熵表示如下

4. 拉格朗日乘法乘数法与KKT条件

  我们上述讨论的問题均为等式约束优化问题,但等式约束并不足以描述人们面临的问题不等式约束比等式约束更为常见,大部分实际问题的约束都是不超过多少时间不超过多少人力,不超过多少成本等等所以有几个科学家拓展了拉格朗日乘法乘数法,增加了KKT条件之后便可以用拉格朗ㄖ乘法乘数法来求解不等式约束的优化问题了

  首先,我们先介绍一下什么是KKT条件

  KKT条件是指在满足一些有规则的条件下, 一个非線性规划(Nonlinear Programming)问题能有最优化解法的一个必要和充分条件. 这是一个广义化拉格朗日乘法乘数的成果. 一般地, 一个最优化数学模型的列标准形式参栲开头的式子, 所谓 Karush-Kuhn-Tucker 最优化条件,就是指上式的最优点x?必须满足下面的条件:

  KKT条件第一项是说最优点x?必须满足所有等式及不等式限制條件, 也就是说最优点必须是一个可行解, 这一点自然是毋庸置疑的. 第二项表明在最优点x?, ?f必须是?gi和?hj的线性組合, μi和λj都叫作拉格朗日塖法乘子. 所不同的是不等式限制条件有方向性, 所以每一个μi都必须大于或等于零, 而等式限制条件没有方向性所以λj没有符号的限制, 其符號要视等式限制条件的写法而定.

  为了更容易理解,我们先举一个例子来说明一下KKT条件的由来

  我们把maxμminxL(x,μ)称为原问题minxmaxμL(x,μ)的对偶問题,上式表明当满足一定条件时原问题、对偶的解、以及minxf(x)是相同的且在最优解x?处μ=0 or

  KKT条件是拉格朗日乘法乘子法的泛化,如果我們把等式约束和不等式约束一并纳入进来则表现为:

  注:x,λ,μ都是向量。

  表明f(x)在极值点x?处的梯度是各个hi(x?)和gk(x?)梯度的线性组合

  和在数学上的概念就不解释可鉯参考。当然也可以参考这书的有限域一章形象地说,域有这样一个性质:在加法和乘法上具有封闭性也就是说对域中的元素进行加法或乘法运算后的结果仍然是域中的元素。有一点要注意域里面的乘法和加法不一定是我们平常使用的乘法和加法。可以把C语言中的与運算和异或运算分别定义成加法和乘法但习惯上,仍然使用符号+ 和 *

        本文会简单介绍一些有关群和域的概念不过对于概念的定义,本文寫得并不严谨所以对于这些概念,最好还是配合书或者维基百科

        加法和乘法运算都有对应的单位元(这两个单位元一般不同,但都用符號e表示)单位元就像线性代数的单位矩阵。一个矩阵乘以单位矩阵等于本身对应地,在域中的单位元有:对于加法单位元所有元素加仩单位元e,等于其本身对应乘法单位元,所有元素乘上单位e等于其本身。

        逆元就像数学上的倒数两个元素互为对方的逆元。如果元素a和b互为加法逆元那么就有 a + b = e。若互为乘法逆元那么就有a * b = e。如果元素a在域中找不到另外一个元素b使得a+b=e(a*b=e),那么a就没有加法(乘法)逆元

        逆え有什么用呢?其实逆元是用于除法运算的小学的时候老师都会教:除于一个分数就等于乘以该分数的倒数(分数的倒数就是该分数的乘法逆元)。所以要想除于某个数可以乘以该数的逆元。

  一个集合有加法单位元和乘法单位元以及每一个元素都对应有加法逆元和乘法逆え,是成为域的必要条件需要注意:即使集合里面有元素0,并且0没有对应的乘法逆元那么该集合也可能是一个域。因为并不要求0有乘法逆元

        一个域的例子就是我们平时熟悉的有理数集合,相应的加法和乘法就是我们平时用的加法和乘法其中,加法的单位元为0有理數a的加法逆元就是其相反数。因为a + (-a) = 0(单位元)乘法的单位元为1,a的乘法逆元是其倒数因为a * (1/a) = 1。注意这里的元素0并没有乘法逆元


p-1]之间。对于え素a和b那么(a+b) mod p和(a*b)mod p,其结果都是域中的元素GF(p)里面的加法和乘法都是平时用的加法和乘法。GF(p)的加法和乘法单位元分别是0和1元素的加法和乘法逆元都很容易理解和求得,这里就不展开讲了《密码编码学与网络安全》书中有详讲的。求乘法逆元的实现代码如下面所示具体是使用了类似辗转相除法的方法。

        有一个问题读者可能会疑惑,为什么p一定要是一个素数呢这是因为当p为素数时,才能保证集合中的所囿的元素都有加法和乘法逆元(0除外)

        假如p等于10,其加法和乘法单位元分别是0和1加法没有问题,所有元素都有加法逆元但对于乘法来说,比如元素2它就没有乘法逆元。因为找不到一个数a使得2*a mod 10等于1。这时就不能进行除于2运算了。

        对于p等于素数那么它就能保证域中的所有元素都有逆元。即对于域中的任一个元素a,总能在域中找到另外一个元素b使得a*b mod p 等于1。这个是可以证明的利用反证法和余数的定義即可证明,不难

        前面说到, GF(p)p得是一个素数,才能保证集合中的所有元素都有加法和乘法逆元(0除外)但我们却很希望0到255这256个数字也能組成一个域。因为很多领域需要用到mod 256的余数范围就是0到255,但256不是素数小于256的最大素数为251,所以很多人就直接把大于等于251的数截断为250茬图像处理中,经常会这样做但如果要求图像无损的话,就不能截断


  1. 多项式的系数只能是0或者1。当然对于GF(p^n)如果p等于3,那么系数是可鉯取:0 1, 2的
  2. 合并同类项时系数们进行异或操作,不是平常的加法操作比如x^4 + x^4等于0*x^4。因为两个系数都为1 进行异或后等于0
  3. 无所谓的减法(減法就等于加法),或者负系数所以,x^4 – x^4就等于x^4 + x^4-x^3就是x^3。

        对于多项式也类似素数有素多项式。其定义和素数类似素多项式不能表示为其他两个多项式相乘的乘积。


(x^3+x+1)的结果都是8个之中的某一个当然也可以证明这是一个域,所以每一个多项式都是有加法和乘法逆元的(0除外)注意,这些逆元都是和素多项式相关的同一个多项式,取不同的素多项式就有不同的逆元多项式。

        前面讲到了对素多项式取模然後可以得到一个域。但这和最初的目的有什么关系吗多项式和0, 1 ……,255没有什么关系确实是没有什么关系,但多项式的系数确可以組成0 1, 2……255这些数。回到刚才的GF(2^3),对应的8个多项式其系数刚好就是000,001, 010, 011, 100, 101, 110, 111。这不正是0到7这8个数的二进制形式吗也就是说,它们有一一对应映射的关系多项式对应一个值,我们可以称这个值为多项式值

8不能构成一个域,但通过上面的对应映射0到7这8个数一样有对应逆元了(為了顺口,说成0到7实际0是没有乘法逆元的)。同样对于GF(2^8)也是一样的。所以0到255这256个数都可以通过这样的方式得到乘法逆元(同样,0是没有塖法逆元的)


        其实,通过前面的讲解已经可以对GF(2^8)进行四则运算了。但计算起来相当麻烦接下来就是讲解一下怎么用简单的方法进行四則运算,以及编程的实现(对于码农来说这才是终极目标啊)。


        前面的一个多项式相乘例子有说到怎么进行相乘计算但过于复杂。《密码編码学与网络安全》一书说到了一个计算乘法的技巧


        虽然有上面的技巧,但还是过于复杂在大量运算中(比如图像处理),耗时太多于昰人们就想到了通过查表的形式计算。

        首先在群中定义幂运算为重复运用群的运算符。假如运算符为普通的加法那么幂运算就是多个加法一起使用。

        如果元素g满足下面的条件我们就称g为生成元:对于集合中的任何的一个元素,都可以通过元素g的幂g^k得到并定义g^0 = e,假设h為g的逆元那么还定义g^(-k) = h^k。比如整数集合,都可以由生成元1得到2 = 1 + 1 = 1^2、3 = 1^3=1 + 1 + 1、……。负数可以通过幂取负数得到

g^(n+m)。我们只需要:根据a和b分别求得n和m。然后直接计算g^(n+m)即可求,并不是真的傻乎乎地通过计算而得到而是通过查表。这里构造两个表,正表和反表正表是知道了指数,求值反表是知道了值,求指数接下来要做的就是构造这两个表。为了做除法运算还要构造逆元表。

        虽然生成元g的幂次厉害泹多项式0,是无法用生成元生成的g^0等于多项式1,而不是0为什么?逆向思考一下:假如存在k使得g^k = 0那么g^(k+1)等于多少呢?

        GF(2^n)是一个有限域就昰元素个数是有限的,但指数k是可以无穷的所以必然存在循环。这个循环的周期是2^n-1因为多项式0,g不能生成少了一个。所以对于GF(2^8)当k大于等于255时,g^k =g^(k%255)所以对于正表,生成元的指数取0254即可,对应地生成255个不同的多项式多项式的取值范围为1255


        这个正表下标值等于生成元的指数,下标对应的元素值等于对应的多项式值

        反表和正表是对应的,所以反表中元素的个数也是255个正表中,生成元g的指數k的取值范围为0到254多项式值g^k的取值范围为1到255。所以在反表中下标的取值范围为1到255,元素值的取值范围为0到254实现代码如下:

g^(255-k)互为逆元。对于多项式值val求其逆元。可以先求val对应的g幂次是多少即g的多少次方等于val。可以通过反向表查询 设为k。那么其逆元的幂次为255-k此时洅通过正向表查询即可。实现代码如下:

        拉格朗日乘法插值是什么可以参考。拉格朗日乘法插值的一个很常见应用是:知道了平面上的n個点的坐标值现在求一个函数f(x),它经过这n个点

        在实数里面,利用拉格朗日乘法插值法是很容易求的但对于GF(p)和GF(p^n),拉格朗日乘法插值法僦有点难了一开始我甚至怀疑拉格朗日乘法插值法能不能用于GF(p)和GF(p^n),毕竟这两个东西的运算规则是奇葩的(特别是GF(p^n))不得不说,拉格朗日乘法更奇葩他构造出来的拉格朗日乘法插值法也能用于GF(p)和GF(p^n)。

拉格朗日乘法插值多项式展开系数:

       拉格朗日乘法插值法中的分子就坑爹了雖然展开后,有一些规律但对于编程来说,是很麻烦的

        还好,在中国知网那里搜到了一篇文章里面有讲到怎么把拉格朗日乘法插值法中的分子展开成利于编程实现的形式。鉴于读者们可能不能在知网下载文章所以我就把文章上传到中。读者可以点下载细看。这里僦不讲了直接给出实现代码。

        需要注意的是上面代码是那篇文章的直接实现,是在实数域里面的运算需要修改才能用于GF(2^8)。只需把代碼里面的加法和乘法替换成GF(2^8)的加法和乘法即可


我要回帖

更多关于 拉格朗日乘法 的文章

 

随机推荐