2つの団変数

  • 団代数には、反対称化可能行列Bによって定まる2通りの変化様式がある
  • それぞれの変化様式には、x変数とy変数と呼ばれる有理式が対応する
  • 団変数の変化
    • n変数の団(クラスター)で変化するものとする
    • Bはnxn行列
    • 今、n個のうちk番目に関する変化をさせるものとする
  • x変数の変化は以下の通り
    • i=kのときx'_i = \frac{1}{x_i} ( \prod_{j \ne i} x_j^{(B_{ik})_+} + \prod_{j \ne i} x_j^{(B_{kj})_+})
    • i \ne kのときx'_j = x_i
  • y変数の変化は以下の通り
    • i=kのときy'_i = \frac{1}{y_i}
    • i!=kのときy'_i = y_i (1 + y_k^{sign(B_{ik})})^{B_{ik}}
  • ここで y_i = \prod_{j \ne i} x_i^{B_{ij}}という対応を入れることにする
    • ただし、このBは団変数(B,x),(B,y)が変化するときに、x,yとともに変化するBとする
    • このようなyは、xを変化させて、そこからBの変化したものを使ってyを計算しても
    • yから、yの変化ルールで変化させても、どちらも同じ変化がえられるという
  • この y_i = \prod_{j != i} x_i^{B_{ij}}の定義については、複数の文書にあたったが、Bが変化していることに言及している場合が少なく、紛らわしい
    • 明記してある資料としてはこちらの52ページがある
    • はっきりさせるためには、 y_i = \prod_{j \ne i} x_i^{B_{ij}}のとき、 y_i' = \prod_{j \ne i} x_i'^{B_{ij}'}のように、y,x,Bのすべてに "'"をつけること
expression(1)
expression(((x2 * x3^3 + 1)/x1)^-1/(x1 * ((x2^-1 * x3^-3)^-1 + 
    1)^-1))
expression(((x2 * x3^3 + 1)/x1)^-3/(x1^3 * ((x2^-1 * x3^-3)^-1 + 
    1)^-3))

団変数の行列による変化

  • 団変数は有理式
  • 団変数は団(クラスタ)をなし、そのクラスタに対して行列で定まる変化が起きる
  • nxn行列はn個の変数を変化させるが、n通りの変化を定める
  • 以下は、それのR実装
  • Rのシンボリック演算パッケージRyacasを使っているが、Simplify()関数が有理多項式に対して不完全なので、いまいちだが・・・。実際には、団変化により既出の変数が現れる
  • 同じ行列が定める2つの団変数が相互に双対関係にあることはこちらの記事で

三角形分割の箙

  • 昨日の記事で団代数についてメモしている
  • 団代数の適用例として多角形の三角形分割がある
  • 多角形も頂点と辺でできており、箙も頂点と辺でできているので、どういう対応になっているのかがわからないとこんがらがる
  • 以下はその関係についての簡単なメモ
  • 多角形の三角形分割と箙の関係
    • 多角形を三角形分割する。いくつもやり方があるが、ある一つの三角形分割を取り出す
    • すべての辺(多角形の辺と、三角形分割で引いた辺とを合わせたすべて)を頂点とみなす
    • 頂点とみなした辺について、三角形を反時計回りに回ることとすると、辺接続関係を表す有向グラフができる。これがこの三角形分割に対する箙
    • 今、この辺接続関係有向グラフのうち、引き直しが可能なのは、三角形分割に際して引いた辺。オリジナルの多角形の辺は変更できない
    • 三角分割辺を引き直すにあたって、一本ずつ引き直すことにする
    • その引き直しは、その辺が対角線となっている四角形についての引き直しである
    • このような引き直しは必ずできるし、一通りの引き直しができる
    • このように、ある箙について、引き直しが可な辺があり、その辺のそれぞれの、引き直しのやり方は一通りある。引き直した結果、辺の数は変わらず、三角形分割の別バージョンが生成される
    • このときの、反時計回り辺接続の箙を作ると、引き直しに選んだ辺について、上述の箙変形ルールになっている

団代数(cluster algebra)

  • こちらが資料
  • 団代数という代数がある
  • 応用が面白いという
  • ちょっと面倒くさいので、自分がわかりにくかった点を補強しながら、説明文を書いておく
  • 団代数は、面倒臭い規則によって定められる「変数(団変数)」の整数係数線形和のこと
    • この「変数(団変数)」というのは、ある変数のセット(これが団・クラスタの由来)の有理式で表される
      • 有理式で表されるものたちを扱いたいので、元となる変数のセットは、代数的に独立で可換であることを仮定すると都合がよく、そのようになっている
    • この基本となる変数のセットは、ある規則で、別の変数のセットに対応付けられる
    • 別の変数のセットへの対応付けは、1個以上ある
    • その対応付けは、変数のセットの構成要素の数だけある
    • 別の変数のセットへの対応付けは、ある一つの構成要素x構成要素の正方行列によって規定される
    • その正方行列は、反対称化可能行列によって定まる
    • つまり、「団代数」は、ある変数のセット x_0と、ある反対称化可能行列 B_0とを定めることで定義できるものである
    • 少し話を複雑にするのは、このB_0には、グラフが対応することである
    • そのグラフは、箙(クイバー)と呼ばれる有向グラフである
    • また、B_0は複数の団代数のセットを、別のセットにまとめて変化させる変化規則を定めているが、B_0自体も、その変化規則によって、別の行列に対応付けることができる
    • 対応付けは、変数セットの構成要素の数だけある
    • それぞれの対応付けは新たな正方行列を生成するが、それも箙になっている
  • さらに複雑になる話があるが、それは、上記を理解したうえで、考えるのがよい
    • B_0が定める規則として、同じく、変数セットの構成要素の数だけの変化規則を別に定めることができる
    • その変化規則によって、別の変数セットとその変化生成変数セットが集合をなす
    • この2つの変化規則には、対応関係があって、その結果生じる変数セットとその構成要素間に、特別な対応関係がある
    • その対応関係は、双対関係にあるらしい
  • 以下は、理解を確かめるためのRコードとその箙
    • 左上の箙を、ノード1,2,3の順に選んで、変化箙を左下、右上、右下に描図
    • 変化箙は
      • (1)選んだノードへの接続辺の向きを変える
      • (2) それ以外の接続関係は、選んだノードkが絡んでいなければ変化させない。選んだノードi,jが両方絡んでいれば、i->kの有向辺がP本(P>=0)、k -> j 有向辺がQ本(Q>=0)のとき、PQ本のi->j有向辺を加える。その上で、i-j間の行ったり来たりはキャンセルする
        • この計算は、選んだノードがk番目として、行列のk行とk列の操作。追加辺の数は、k行とk列の非負化ベクトルのouter()積が作る、Bと同サイズの行列として計算できる。i-j間の行ったり来たりは、元の行列に増分を加算することで計算できる

f:id:ryamada:20190811061459p:plain

> B
     [,1] [,2] [,3]
[1,]    0   -1    2
[2,]    1    0   -1
[3,]   -2    1    0
# 変化したB.
     [,1] [,2] [,3]
[1,]    0    1   -2
[2,]   -1    0    1
[3,]    2   -1    0
     [,1] [,2] [,3]
[1,]    0    1    1
[2,]   -1    0    1
[3,]   -1   -1    0
     [,1] [,2] [,3]
[1,]    0    1   -2
[2,]   -1    0    1
[3,]    2   -1    0
  • 三角形分割の箙表現についてはこちら
  • 団変数は有理式。その正方行列による変化についてはこちら
  • 同じ行列が定める2つの団変数が相互に双対関係にあることはこちらの記事で

PyQuboを使ってみる、openjijも使ってみる

  • QUBOは制約条件下での解探索をしてくれる
  • pyQuboは制約式を書いて、それをコスト関数QUBOにしてくれる
  • Mac
  • Cmakeが入っていなくて、brewも使えない状態だったので
  • まずbrew を使える様にする
  • Homebrewのコピペコマンドを使ってbrewを使える様にする
  • ついで
brew install cmake
  • そのあと
pip install pyqubo
pip install openjij

ぱらぱらめくる『高校数学からはじめる量子コンピュータ』

第1章 量子コンピュータへの誘い

  • 量子ビットは、nビットで2^n通りを表せる
  • nビットが一度にもてる値も2^n通り(量子力学による重ね合わせの原理が働いているから)
  • ただし、測定で得られる結果は確率的に出てきて、その値は1回に1個。1測定で状態は変わってしまう。何度も測定することもあり。求める解が出る確率を高める工夫をする必要が実用上は大事

第2章 1量子ビットの世界

  • 量子ビットは、複素数の組で、2つの複素数の絶対値の二乗の和が1
  • Q:=\{\begin{pmatrix} a\\b \end{pmatrix} \in \mathbf{C}^2 | |a|^2 + |b|^2 = 1\}
  • 古典ビットは0か1か。それを|0>, |1>と書くことにすると、\begin{pmatrix} a\\b \end{pmatrix} = a \times |0> + b \times |1>; a,b \in \mathbf{C}, |a|^2 + |b|^2 =1と表せる
  • 複素ベクトルの内積<\psi | \psi> = (a^* \\ b^*) \begin{pmatrix} a\\ b \end{pmatrix} = a^* a + b^* b = |a|^2 + |b|^2と書くことにすると
  • Q = \{ |\psi > \in \mathbf{C}^2 | <\psi | \psi > =1\}と書ける
  • 量子ビットを測定すると、|0>または|1>が得られる。それぞれが得られる確率が|a|^2,|b|^2である
  • 古典コンピュータでは、0,1の値を変化させる。コンピュータの内部的には、AND, OR, XORなどの基礎的演算ですべてのプログラムは動いている
  • 量子コンピュータでは、量子状態を発展させる。このとき、状態発展なので、測定して得られる確率が全部で1、を守るような発展をすることが必要で、そのような発展がユニタリ発展
  • 具体的にはユニタリ行列によって状態ベクトル(重ね合わせ)は発展する
  • ユニタリ行列は U^{\dagger} U= I
  • 古典コンピュータでは、0,1の値を取って、0,1の値を返す基礎演算を電子回路で作成した
  • 量子コンピュータでは、ユニタリ発展をハードウェアとして実装する
  • 量子状態の区別。量子状態は、確率を測定してみて、初めてわかるもの(らしい)。したがって、測定して確率情報を得ることで状態についての知識が得られる。確率情報が同じだが、異なる量子状態は区別できない。ある状態では確率が同じだが、ユニタリ発展させると確率が変わるような量子状態は、ユニタリ発展させてみることで区別が可能になる。他方、ユニタリ発展させても、区別できないような異なる量子状態というものも存在する。ある量子状態に絶対値1の複素数をかけてできる量子状態は、この「区別できない量子状態」である
  • RにQuantumOpsというパッケージがある。それを使って、上記のことをやってみる。資料はこちら
# install.packages("QuantumOps")
library(QuantumOps)
k1 <- ket(1,2)
k1 # |k1|^2 = 1に標準化される
k2 <- ket(1i, 2*1i)
k2 
# k1と同じになる。c(1i,2*1i) = 1i * (1,2) であり、絶対値1の複素数(この場合は1i)をかけてできる量子状態は区別できないことに対応する
    • Multi-qubit Kets
      • 2^n要素で作ることができる
ket(1,1,3,1)
k1 <- ket(0,1)
k2 <- ket(1,1)
k1k2 <- tensor(k1,k2)
k1k2
k1k2k2 <- tensor(k1k2,k2)
k1k2k2
# tensor()関数はqubitsを3個以上も取れる
tensor(k1,k2,k2)
      • Dirac 記法(\sqrt{2} |00> + \sqrt{2} |10>のような)も用意されている
dirac(k1)
dirac(k1k2)
dirac(k1k2k2)
> dirac(k1k2)
[1] "0.707|10> + 0.707|11>"
> dirac(k1)
[1] "1|1>"
> dirac(k1k2)
[1] "0.707|10> + 0.707|11>"
> dirac(k1k2k2)
[1] "0.5|100> + 0.5|101> + 0.5|110> + 0.5|111>"
      • input registerの情報に基づき、target registerの値を変える。RのQuantumOpsパッケージのUf()関数の仕様確認は→こちらの記事

第3章 1量子ビットの量子回路

  • 量子回路にはユニタリ発展に相当するユニタリ行列を配置する。入力と出力を持つ
  • 量子回路からの測定は、量子回路から、古典回路に値をコピーする、という形式で表す
    • RのQuantmuOpsパッケージでは、I(),X(),Y(),Z(),H(),R(),S(),T()という、1量子ビット用の演算関数が用意されている。その演算の行列表示は
X
    • のようにすると、関数の中身が見られる

第4章 2量子ビットの世界

第5章 2量子ビットの量子回路

  • 量子ビットのユニタリ発展は4x4行列が必要。規模が大きくなると行列が大きくなる
  • それを防ぐのに次のルールがある
    • (U \otimes V) (|\psi> \otimes |\phi>) = (U |\psi>) \otimes (V |\phi>)
  • このようなことができるのは、量子がもつれていないとき

第6章 量子プログラミング・入門編

  • QiskitをローカルPCで実行する環境を作る
    • こちらに従って、Anacondaインストール後に
    • Windows10のスタートアップメニューからAnaconda promptを立ち上げ、そこで
conda create -n myHoge python=3
activate myHoge
    • すると、プロンプトにmyHogeに入っている、と見える。そのうえで
pip install qiskit
    • 長くかかるが…。終わったら
pip install qiskit-terra[visualization]
    • これで準備ができたはず
    • そのまま、myHogeのプロンプトで、
jupyter notebook
    • とjupyter notebookを起動し、新しい、python3 ノートを開けば
import qiskit
    • がきちんと(ちょっとロードに時間がかかるが)回る
    • Macではターミナルから
conda create -n myHoge python=3
activate myHoge
pip install qiskit
pip install qiskit-terra[visualization]
jupyter notebook
    • とする
  • というわけで準備ができたので、本のサイト(こちら)のjupyter notebookをダウンロードして、この環境で開けばなぞれる

第7章 量子プログラミング・実機編

  • IBMのサイトに行って、そのアカウントにTokenを使ってローカルからアクセスして…というのは、本が書かれた時から仕様変更があるらしく、難航
  • それよりはIBMのサイト上で遊ぶのがよいかも
  • いずれにしてもtutorialはこちら

qiskit.org

Appendix