線形代数研究ノート
行列(マトリックス)
行列と行列の加速について
簡単な紹介
数学では、マトリックスは、第1のマトリックス係数とからなる方程式の定数から複雑又は実数のセットに従って配置された長方形のアレイである - Baiduの百科事典
人気の用語は、コレクションの一部の数が行列を取得するために矩形に充填します
定義
$ Mは\回N $数の$ A_ {I、J} $着信番号テーブルがマトリクス行$ $ $ M $ n列に配置されている回N $行列\ $ Mをいいます。
$$
A = \ \ A_ A_ {2,1}、{2,2&&&...&A_ {} {始めるA_ {1,1} {1,2}&A_&A_ {...} - 。1、N- bmatrix} 2、N-} \ ...&...&...&... \ A_ {M、&A_ {M}。1、2}&...&A_ {M、N-} \}終了{bmatrix
$$
行列要素と呼ばれるこの$のn \回M $ $ A $数は、メタデータと呼ばれます。。。(残りのBaiduの百科事典はがらくたです
そこ$ M $ $行$ n列の行列も$ A_ {MN} $と呼ばれ
具体的には、2 $ Nは、M $は同じアイソタイプ行列が行列と呼ばれています
$ N = M $ $順序N- $ $ $ n次正方行列の行列又は行列と呼ば
基本的な操作
追加
$$
\開始{bmatrix} A_ {1,1}&...&A_ {1、N} \ ...&...&... \ A_ {M、1}&...&A_ {M、 N} \端{bmatrix} + \開始{bmatrix} B_ {1,1}&...&B_ {1、N} \ ...&...&... \ B_ {M、1}& ..&B_ {M、N} \端{bmatrix} = \開始{bmatrix} A_ {1,1} + B_ {1,1}&...&A_ {1、N} + B_ {1、N} \ ...&...&... \ A_ {M、1} + B_ {M、1}&...&A_ {M、N} + B_ {M、N} \端{bmatrix}
$$
一方、行列の加算と連想と可換として実数の追加
即
$$
A+B=B+A
$$
$$
(A + B)+ C = A +(B + C)
$$
それは注意すべきである、唯一の行列の同じタイプの付加することができます
引き算
フォーカスの数、加算として減算逆演算
マトリックスに同じである
$$
&{...&A_。1、N-} \ ...&...&... \ A_ {M ,. 1}・{始めるA_ {1,1} bmatrix} \。 ..&A_ {M、N} \端{bmatrix} - \ ...&...&... \ {1、n}は{} bmatrix B_ {1,1}を開始&...&B_ \ B_ { M、1}&...&B_ {M、N} \端{bmatrix} = \開始{bmatrix} A_ {1,1} -b_ {1,1}&...&A_ {1、n}は-b_ {1、N} \ ...& ...&... \ A_ {M、1} -b_ {M、1}&...&A_ {M、N} -b_ {M、N} \端bmatrix} {
$$
それはまた、実数の集合に法律を満たします
乗算
すなわち、行列の乗算、概念の行列乗算に組み込ま
$$
&{...&A_。1、N-} \&... {始めるA_ {1,1} bmatrix} \ MUは、・\ .. 。&... \ A_ {M、 1}&...&A_ {M、N} \端{bmatrix} = \開始{bmatrix} \ミュー・A_ {1,1}&...&\ミュー・{1 A_、N-} \ \\ ...&...&... {MU A_・M ,. 1}&...&\ A_ MU・{M、N-} \}終了{bmatrix
$$
マトリックス乗算は次のルールを満たす:
$$
MU \ラムダ(\ MUのA)=(\ Aラムダ)\
$$
$$
\ラムダ(\)=(\ラムダ\)
$$
$$
(\ラムダ+ \)= \ラムダ+ \
$$
$$
\ラムダ(A + B)= \ラムダA + \ラムダB
$$
乗算
二つの行列の乗算は、第1の行列$ A $と他の行列の$ B $の列の数に等しい行数ならば定義することができます。
称する
$$
A_ B_ {Mnは}} NP {C_ {MPが} =
$$
もあること
$$
AB = C
$$
$ C $ $ C_ {I、J} $値の要素
$$
C_ {Iは、J} = \ sum_ {K = 1} ^ Na_ {I、K} \タイムズB_ {K、J}
$$
例えば
$$
\開始{bmatrix}。1&0&2 \ -1&3&1つの\終了{bmatrix} \時間\開始{bmatrix} 3&1 \ 2&1 \ 1&0 \端{bmatrix} = \開始{bmatrix}(1 \回3 + 0 \ times2 + 2 \ times1)&(1 \ times1 + 0 \ times1 + 2 \ times0)\( -1 \ times3 + 3 \ times2 + 1 \ times1)&( - 。。。。。。。始める{bmatrix} \ 1 \ times1 + 3 \ times1 + 1 \ times0)\終了{bmatrix} = 5&1 \ 4&2 \終了{bmatrix}
$$
一方以下の行列の計算法を掛けます:
連想:
$$
(AB)C = A(BC)
$$
分配プロパティを左:
$$
(A + B)+ Cは、BCをAC =
$$
右分配法則を:
$$
C(A + B)は、CA + CBを=
$$
行列加速
高速電力
それを言う必要がありますか?
int base=a,ans=1;
while(b>0){
if(b&1){
ans*=base
ans%=c;
}
base*=base
base%=c;
b=b>>1;
}
return ans;
非常に単純なビット演算です
だから我々は、そうすることができ行列計算の力を尊重し、時間複雑さの$ O(n)から$に$ Oダウン(log_2n)$そう
この非常に快適
しかし、これは何を使用しているのですか?
例A
[1] = [2] [3] = 1 =
[X] [X-3] = + [X-1](x> 3)
モジュロ列N十億七(10 ^ 9 + 7)の項目数の値を見つけます。
一見すると、このトピック
?
これは、ポイント送信することではありません
一つ一つ私がプッシュし好きではないのですか???
データT <= 100、N <= 2 * 10 ^ 9の100%、
笑顔が徐々に固化します
だから今加速マトリックスの有用性を反映
列の$ F(N)= F(NX)+ F(NY)+ ... $の数について
我々が$ f(x)が、F(Y)と、つまり、現在の状態の$ K \ times1 $行列表現を構築することができます... $既に知っている私たちの現在を示すために、
この遷移行列の後に私たちの元の行列の乗算は、答えを得るために、ステップで一歩前進を移動するために、新しい$ f(x)が$を得るために、新しい行列に変換することができますように、その後、我々は、転送行列を構築します
明らかに、我々は、$ F(N-1)$と$ F(N-3)$を使用する必要があるため 、 私たちは、2つの状態は、$ F(N-3)を保持する必要が $ である状態は$ F(N-2)$継承ので、我々はまた、保持する必要があるので、元の行列は、このように構成することが
$$
\ bmatrix開始{F}(3)\ F(2)\ F(1)\ {エンドbmatrix }
$$
すなわち
$$
\ bmatrix} {開始1 \ 1 \ 1 \ {終了} bmatrix
$$
その後、私たちは、この行列の次の行列を取得する方法を考えます
我々の現在の計画行列
$$
\ bmatrix {F}開始(1-N-)\ F(N-2-)\ F(3-N-)\}終了{bmatrix
$$
我々はマトリックスを望ん
$$
\ {始まりますF} bmatrix(N-)\ F(1-N-)\ F(N-2-)\}終了{bmatrix
$$
ものと
$$
\ bmatrix {F}開始(1-N-)\ times1 + F(N-2- )\回0 + F(N -3)\ times1 \ F(N-1)\ times1 + F(N-2)\ times0 + F(N-3)\ times0 \ F(N-1)\ times0 + F(N - 2)\ times1 + F(。N-- 3)\ times0 \終了{bmatrix}
$$
私達の遷移行列明らか
$$
。。。。\開始{bmatrix} 1&0&1 \ 1&0&0 \ 0&1&0 \終了{bmatrix}
$$
以来最初の項目は$ F(3)$であるので、我々はちょうど我々が得ることができる$のn-3 $倍元の行列の遷移行列を取る必要があります!
しかし、ここで、これは、$ O(n)の$アルゴリズムそれではないでしょうか?しかし、遅いのもたくさん
もちろんそうではありません!私たちは、行列の乗算の関連性について考えます
私たちは、元の行列の$ A $を設定し、転送行列$ Bは$、そして私たちの最終的な答えは行列である
$$
\のunderbrace {B(B(B(B(B(B(B ...(N-B} _ { A} -3))))))
$$
行列乗算が連想され、この式のように簡略化することができる
$$
B ^ {A} 3-N-
$$
得られ、ここで、我々は、高速電力行列を使用することができ最終的な答え!
$ O(log_2n)$は本当に速いです(
私は、コード非常に醜い巨人を貼り付け:
#include<cstdio>
#include<cstring>
#include<iostream>
#define mod 1000000007
using namespace std;
struct Ju{
long long p[5][5];
Ju operator *(const Ju &a)const{
Ju c;
for(long long i=1;i<=3;i++){
for(long long j=1;j<=3;j++){
c.p[i][j]=0;
}
}
for(long long i=1;i<=3;i++){
for(long long j=1;j<=3;j++){
for(long long k=1;k<=3;k++){
c.p[i][j]+=(a.p[i][k]*p[k][j])%mod;
c.p[i][j]%=mod;
}
}
}
return c;
}
}ans,base;
void build(){
for(long long i=1;i<=3;i++){
for(long long j=1;j<=3;j++){
base.p[i][j]=0;
}
}
base.p[1][1]=base.p[1][3]=base.p[2][1]=base.p[3][2]=1;
ans.p[1][1]=ans.p[2][1]=ans.p[3][1]=1;
}
void qsm(long long p){
while(p!=0){
if(p&1){
ans=ans*base;
}
base=base*base;
p>>=1;
}
}
long long T,n;
int main(){
cin>>T;
for(long long i=1;i<=T;i++){
cin>>n;
if(n<=3){
printf("1\n");
continue;
}
build();
qsm(n-3);
cout<<ans.p[1][1]<<endl;
}
return 0;
}
二つの例
フィボナッチは、あなたが数の段落nを聞いてみましょう、データ範囲はLONGLONGレベルであります
明らかに加速マトリックス
元の行列の構造:
$$
(1)\ bmatrix {開始} F(2)\ F \ bmatrix終了{} = \ {bmatrixを開始1。} \ 1 \}終了{bmatrix。
$$
状態から転送された方法についての回答の考察
$$
\ bmatrix開始{F}(N)\ F(1-N-)\ bmatrix終了{} = \ bmatrix {F}開始(1-N-)\ times1 + times1 \ F \ F(N-2-)(N- -1)\ times1 + F(N-2-)\ times0 \}終了{bmatrix
$$
転送行列よう
$$
\ bmatrix {開始}。1. 1&\ 0.1&\}終了{bmatrix
$$
以下は、単純マトリクス高速電力であります