{算法}YY矩阵乘法

原创 2016年06月01日 20:06:57

矩阵乘法在OI历程中占据了极其重要的地位
而且也很好用~~

矩阵乘法的定义

我们定义A[x,y]B[y,z]=C[x,z]

Ci,j=k=1yAi,kBk,j

非常简单,可以看出朴素相乘的复杂度是O(xyz)
//然而,暂时我还不了解更简单的办法

二进制矩阵

呃,简单地说,就是将乘法换成and(与运算),加法换成xor(异或)

矩阵乘法的性质


  1. 满足结合律即(A∗B)∗C=A∗(B∗C)
  2. 不满足交换律即A∗B∗C≠C∗B∗A,严谨的说,是不一定的。
    通俗的讲,会出现无法进行运算的情况,还怎么交换律?
    (这取决于矩阵乘法的定义)
  3. 由(1)可得,它可以运用快速幂

作为一个蒟蒻,我能做的是给你们这个网址(至少我没有看懂)

矩阵乘法的作用

让我们先来看一道题目

斐波那契数列
 大家都知道斐波那契数列,其中F(1)=0,F(2)=1,F(N)=F(N-1)+F(N-2)(N>=3),输入N(1<=N<=10^9),计算F(N)mod 100000007的值

方法很简单,计算Fn,然后取模

那么问题来了

How can you compute the answer to this question?
简单地套公式显然不会对,我们考虑运用矩阵乘法解决这道题。

我们定义矩阵A[1,2]表示斐波那契数列i1i(取模意义下)
我们的目标是,将矩阵A和其他矩阵相乘,做到每次使i+1(即多推一位)
我们再引用一个矩阵B[2,2],适当构建B,使A*B刚好推后了一位。
怎么构建呢?
还是留给大家想想吧。
然而这还不够,尤其是时间

满足结合律即(A∗B)∗C=A∗(B∗C)可得,它可以运用快速幂
ans=ABBB
ans=ABn

提供Code

const
        moder=100000007;
type
        matrix=array[1..2,1..2] of int64;
var
        n:longint;
        a,b:matrix;
        i,j,l:longint;
function matr(a,b:matrix):matrix;//表示A*B
var
        c:matrix;
        i,j,l:longint;
begin
        for i:=1 to 2 do
        for j:=1 to 2 do
        begin
                c[i,j]:=0;
                for l:=1 to 2 do
                        c[i,j]:=(c[i,j]+(a[i,l]*b[l,j]))mod moder;
        end;
        exit(c);
end;
function qsm(x:matrix;y:longint):matrix;//快速幂(矩阵版)
var
        c:matrix;
begin
        if y=1 then exit(x);
        if y=0 then
        begin
                c[1,1]:=1;c[1,2]:=0;
                c[2,1]:=0;c[2,2]:=1;
                //此处c相当于1
                exit(c);
        end;
        if(y shr 1=0)then
                exit(qsm(x,y and 1))
        else
        if(y shr 1=1)and(y and 1=0)then
                exit(matr(x,x))
        else
        if(y shr 1=1)then
                exit(matr(qsm(x,2),qsm(x,y and 1)))
        else
        if(y and 1=0)then
                exit(qsm(qsm(x,y shr 1),2))
        else
                exit(matr(qsm(qsm(x,y shr 1),2),qsm(x,y and 1)));
end;
begin
        b[1,1]:=0;b[1,2]:=1;
        b[2,1]:=1;b[2,2]:=1;
        readln(n);
        a:=qsm(b,n-2);
        writeln(a[2,2]);
        close(input);close(output);
end.
版权声明:本文为博主原创文章,转载时请标明出处。 举报

相关文章推荐

Strassen矩阵乘法算法-c++实现

基本完全参考以下文章实现,不过是看了一遍之后自己为了加深理解手写的。 http://www.mamicode.com/info-detail-673908.html #include "stdaf...

算法重拾之路——strassen矩阵乘法

算法重拾之路——strassen矩阵乘法

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

51NOD 1836 战忽局的手段(矩阵乘法加速+__float128精度问题+概率期望)——算法马拉松20(告别美国大选及卡斯特罗)

传送门题目描述:众所周知,有一个神秘的组织——战忽局,在暗中保护着我们。在局中任职的官员都有着极强的忽悠技巧,不只能用预言,还能用往事忽悠人。如今某外星间谍已经获得了战忽局曾经参与的n次事件的资料,局...

贪心算法-Strassen矩阵乘法

两个矩阵的乘法学过线性代数的都知道怎么求,一般来说复杂度为O(N^3).直接给出标准的算法代码:public class MartixMultiply { public static int[][]...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)