情報科学 › 研究のための計算の実務 › NumPy で書く配列計算

重なりのある更新

命題 4.2(「NumPy で書く配列計算」§4) ・ ✓公理まで証明済み

メモリを、番地から値への写像 μ\mu とみる(1 要素を 1 つの番地で代表させる)。有限集合 JJ の各 jj に、出力の番地 ω(j)\omega(j)、入力の番地 ρ1(j),…,ρm(j)\rho_1(j),\ldots,\rho_m(j) が定まっていて、ω\omega は単射とする。関数 ff による更新の 2 通りの実行を考える。

  • 一時配列を使う実行: すべての jj について τj=f(μ(ρ1(j)),…,μ(ρm(j)))\tau_j=f(\mu(\rho_1(j)),\ldots,\mu(\rho_m(j))) を先に計算し、そのあとで μ(ω(j))\mu(\omega(j)) を τj\tau_j に書き換える。
  • 逐次実行: JJ の元をある順序 j1,j2,…j_1,j_2,\ldots に並べ、順に「その時点のメモリから ρ1(jt),…,ρm(jt)\rho_1(j_t),\ldots,\rho_m(j_t) を読み、ff の値を ω(jt)\omega(j_t) に書く」を行う。

このとき次が成り立つ。

  1. j≠j′j\ne j' ならばすべての ll で ω(j)≠ρl(j′)\omega(j)\ne\rho_l(j') である(ある要素の出力先を、別の要素の計算が読まない)とき、逐次実行の結果は順序によらず、一時配列を使う実行の結果と一致する。とくに、出力の番地の集合と入力の番地の集合が交わらないとき、および出力と入力がまったく同じ配置(ω(j)=ρ1(j)\omega(j)=\rho_1(j) で、ほかに重なりがない)のときにそうである。
  2. 長さ n≥3n\ge3 の配列 aa に対する a[1:] += a[:-1](J={1,…,n−1}J=\{1,\ldots,n-1\}, ω(j)=ρ1(j)=j\omega(j)=\rho_1(j)=j, ρ2(j)=j−1\rho_2(j)=j-1, f(x,y)=x+yf(x,y)=x+y)は 1 の条件を満たさない。一時配列を使う実行の結果は aj′=aj+aj−1a'_j=a_j+a_{j-1}、添字の小さい順の逐次実行の結果は aj′=a0+a1+⋯+aja'_j=a_0+a_1+\cdots+a_j(累積和)で、a0≠0a_0\ne0 ならば j=2j=2 で異なる。

本文で読む(証明と前後の説明)→

閉包の状態

✓ 公理まで証明済み

証明が使う定理を 前提 としてたどると、Rikai の中の証明だけで定義・公理(物理では基本仮定)までつながっています。

印の意味: ✓公理まで証明済み ・ △証明あり(閉包未完)・ ※主張のみ。テーマごとの集計は 閉包の状況。

前提をたどる 証明が使う定理・定義

証明は Rikai の他の定理を参照していません(定義と論理だけで示されています)。

これを使っている定理

証明で明示的に参照している定理は、まだありません。

関連するノック 1 問