行列乗算プログラムの入れ子ループの不変式


7

Hoareロジックを使用して2つの行列を乗算するためのプログラムの正確性を証明することについて、卒業論文を作成しています。これを行うには、このプログラムの入れ子ループの不変式を生成する必要があります。

for i = 1:n
    for j = 1:n
        for k = 1:n
            C(i,j) = A(i,k)*B(k,j) + C(i,j);
        end
    end
end

私は最初に内部ループの不変式を見つけようとしましたが、今までは本当のものを見つけることができません。上記のプログラムの不変式を見つけるのを手伝ってくれる人はいますか?

回答:


11

C(i:j) = 0最も内側のループの直前の行が必要です。それ以外の場合、コードは正しくありません。

ラインはここで、所定の位置にあると仮定すると、ちょうど(最強可能)不変である前に、最も内側のループ内の割り当ては: (はい、全体のこと。)だけ不変の後に割当てが有するの代わりにの最後の和にし、それ以外は同一です。

CIJ=∑k=1nAIkBkJfor all I and J such that 1≤I<i and 1≤J≤nand   CiJ=∑k=1nAikBkJfor all J such that 1≤J<jand   Cij=∑K=1k−1AiKBKj.
kk−1

教授、私はあなたにメールを送った。君を邪魔したならごめんね。:)
— asn32

2

「the」不変などはありません。どのループにも多くの不変があります。興味深い不変式を見つける必要があります。ループが行列の乗算を計算していることを証明しようとしているので、不変式は、、の係数は行列積の係数、つまり それはむしろとこのプロパティを特化して、外部ループと中間ループの不変量を推測するのは自然です。i=j=k=nCA×B

∀i∈[1,n],∀j∈[1,n],C(i,j)=∑k=1nA(i,k)⋅B(k,j)
ij
  • ∀j∈[1,n],C(i,j)=∑k=1nA(i,k)⋅B(k,j)外側のループ
  • C(i,j)=∑k=1nA(i,k)⋅B(k,j)中間ループの

内部ループを実行するたびに、番目の項が合計に追加され、提案された不変式が導かれます この不変式が成立する場合、中間ループ用に提案された不変式が成立し、それから、外側ループ用に提案された不変式が成立し、プログラムが期待どおりの動作をすることが簡単にわかります。k

C(i,j)=∑l=1kA(i,l)⋅B(l,j)

まだ証明されていないのは初期状態です。、つまりことを証明する必要がありますプログラムへの入り口で。初期化した方がいいでしょう。あるいは、内側のループに入る直前に、中間のループ内で初期化を行うことによって、このプロパティを実現できます。∀i,∀j,C(i,j)=∑l=10A(i,l)⋅B(l,j)∀i,∀j,C(i,j)=0C

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.