{算法}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.
版权声明:本文为博主原创文章,转载时请标明出处。

矩阵乘法的算法实现 [转载]

一般矩阵乘法算法: 原理:矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的栏数(column)和第二个矩阵的列数(row)相同时才有定义。一般单指矩阵乘积时,指的便是一般矩阵乘积。若A为m×...
  • zhengqijun_
  • zhengqijun_
  • 2016年11月26日 23:04
  • 3473

矩阵乘法优化算法

本篇文章大部分思路与代码都来自于微信公众号“CPP开发者”中2016年4月11日的文章《矩阵相乘优化算法实现讲解》,基本相当于这篇文章的重点重述。 矩阵是什么以及矩阵乘法是怎么操作的,我想点开这篇文...
  • dannis_bh
  • dannis_bh
  • 2016年04月12日 22:25
  • 2737

矩阵乘法的并行化算法讨论

矩阵乘法是线性代数里面会讲到的一种非常基础、也十分普遍的计算规则。另一方面,矩阵乘法同时也是并行计算领域常常被用来作为范例的一个话题。它的特点是首先计算量可能相当大,适合利用并行实现来提高效率。其次,...
  • baimafujinji
  • baimafujinji
  • 2015年09月26日 13:28
  • 13496

矩阵乘法 之 strassen 算法

一般情况下矩阵乘法需要三个for循环,时间复杂度为O(n^3),现在我们将矩阵分块一般算法需要八次乘法 r = a * e + b * g ; s = a * f + b * h ; t = ...
  • yangquanhui1991
  • yangquanhui1991
  • 2015年04月11日 19:41
  • 2994

一些算法的MapReduce实现——矩阵分块乘法计算(2)

Problem M*N的矩阵A分割成s*t, N*P的矩阵B分割成t*v, 所以 Input ,M为矩阵,i, j为矩阵M的元素下标,m_ij为矩阵M行列下标为i,j的非0元素   假设矩阵A,B...
  • wzhg0508
  • wzhg0508
  • 2013年12月22日 00:54
  • 1934

矩阵相乘优化算法实现讲解

矩阵相乘算法优化详解!在学习矩阵算法的相关操作时,矩阵相乘是最基础的算法,也是比较简单的算法,但是也是非常重要的算法。...
  • ydd97
  • ydd97
  • 2015年08月18日 17:27
  • 6840

【算法导论】动态规划之“矩阵链乘法”问题

动态规划-“矩阵链乘法”问题
  • cyp331203
  • cyp331203
  • 2015年01月21日 15:12
  • 5970

【算法导论】矩阵乘法strassen算法

一般情况下矩阵乘法需要三个for循环,时间复杂度为O(n^3),现在我们将矩阵分块如图:( 来自MIT算法导论 ) 一般算法需要八次乘法 r = a * e + b * g ;...
  • zhuangxiaobin
  • zhuangxiaobin
  • 2014年07月02日 21:40
  • 2830

矩阵乘法优化DP

矩阵乘法优化DP 在许多的DP题目中,转移方程本身不难推,但是需要循环的次数巨大。这时候可以利用矩阵乘法将时间复杂度从O(n) 优化到 O(log n)。这里只用十分简单的一维DP做例子。如何乘在矩...
  • u011056504
  • u011056504
  • 2016年06月04日 17:03
  • 1562

我们可以推测矩阵乘法最优解的时间复杂度么?

矩阵乘法的定义为: 按照定义,一个简单的方阵乘法伪代码如下: int A[48,48],B[48,48],C[48,48] for i in 1 to 48 ...
  • hanghangde
  • hanghangde
  • 2015年11月28日 18:16
  • 1794
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:{算法}YY矩阵乘法
举报原因:
原因补充:

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