パウリ行列の乗算


12

パウリ行列が量子物理学では非常に一般的に表示される2×2行列のセットです(いや、あなたはこの挑戦のための任意の量子物理学を知っている必要はありません)。セットにアイデンティティを含める場合、4つのマトリックスは次のとおりです。

 σ0 =      σ1 =      σ2 =      σ3 = 
[1  0]    [0  1]    [0 -i]    [1  0]
[0  1]    [1  0]    [i  0]    [0 -1]

乗算それは複雑な相のいずれかを乗じてもよいが、常に、別のパウリ行列を与えるこれらのうちの2つを1i-1-i。たとえば、。σ1σ3 = -iσ2

あなたの仕事は、多数のパウリ行列を乗算し、結果の行列と位相を返すことです。入力は、数字の非空の文字列として指定する03行列を表すします。出力は、結果のマトリックスの1桁の数字を含む文字列で、オプションで前に、または位相を示します(は)。σ0σ3i--i--1

プログラムまたは関数を作成し、STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(out)パラメーターを介して結果を出力できます。

パウリ行列に関連する組み込み(またはサードパーティ)機能を使用しないでください。

これはコードゴルフで、最短の回答(バイト単位)が勝ちです。

テストケース

1 => 1
13 => -i2
000 => 0
123 => i0
03022 => 3
02132230 => -i3
1320130100032 => i2
311220321030322113103 => -2
0223202330203313021301011023230323 => -i0
1323130203022111323321112122313213130330103202032222223 => -1

3
abstract-algebraタグを追加しました。これは、一般化されたクォータニオングループの単語の単純化を本質的に要求しているためです。
ピーターテイラー

回答:


3

Pyth、47バイト

これはまだゴルフ可能だと思います。しかし、それはCJamに大きく勝っています。

p.U&-=T*q3l{[0bZ)^_1%-Zb3xbZmvdz@+c"i - -i")khT

オンラインで試す:デモンストレーションまたはテストスイート

説明

結果の行列タイプを決定することは、単にすべての数値をxoringすることです。

2つの行列を乗算A*Bするときに、行列がでなくである場合、位相が変化σ0A != Bます。

                                                 implicit: T=10, z=input string
                            mvdz                 evaluate each char of the input 
 .U                                              reduce: b=first value, for Y in mvdz[1:]
    -=T                                            T -= ...
        q3l{[0bZ)                                     (3 == len(set([0,b,Z])))
       *         ^_1%-Zb3                             * (-1)^((Z-b)%3)
   &                                               and
                         xbY                       update b by (b xor Y)
                                 +c"i - -i")k    the list ["i", "-", "-i", ""]
                                @            hT  take the element at index T+1 (modulo wrapping)
p                                                print phase and matrix

もちろん、同じアルゴリズム(本質的にSp300のアルゴリズム)を使用する場合は44です。
オプティマイザー

9

Python 2、108 89 87 86バイト

x=y=0
for m in map(int,raw_input()):x+=m*y and(m-y)%3*3/2;y^=m
print"--i"[~x%4::2]+`y`

(助けてくれた@grcと@xnorに感謝)

説明

係数とベースマトリックスを分割しましょう。我々は唯一のベースマトリックスに焦点を当てた場合、我々は、この乗算テーブルを取得する(例えば13ある-i2我々は入れて、2):

  0123

0 0123
1 1032
2 2301
3 3210

これは、ビット単位のxorを行うのと同じことです。

それでは、係数に注目しましょう。それぞれを0123示す1,i,-1,-iと、次のようになります。

  0123

0 0000
1 0031
2 0103
3 0310

このために、まずm*y、左の列と上の行に注意して、いずれかの数値が0かどうかを確認します。追加すると、(m-y)%3次のようになります。

  0123

0 0000
1 0021
2 0102
3 0210

これは近いですが、の2代わりに持っています3。これを実行するには、を実行し*3/2ます。

インデックス付けの場合、文字列を取得し"--i"、インデックスから始まる2番目の文字をすべて選択すると、が0123得られることに注意してください"-i","-","i",""


素敵なストリングスライシング、私はこれを忘れてい ました。私はあなたがすることができると信じ3-n%4~n%4m*y and(m-y)%3*3/2魔法の文字列でもっと短く表現できると思うが、私の最初の試み877449216>>2*m+8*yは結びついているだけだ。if Y=m^y、式はであるというかなり代数的な式もありますが(m-y)*(y-Y)*(Y-m)/2、それは長いです。
xnor

@xnorああ~、いいですね- オフバイワンは私を悩ませていました:/私m*y and(m-y)%3*3/2も短くすることができると確信していますが、私は一晩中過ごしてどこにも行けませんでした...私が戻ってきたら時間がある。多分私が自由mod 4を持っているという事実が役立つかもしれません。
Sp3000

6

網膜、77バイト

この機会を利用して、Retinaの新しい機能であるマルチステージループを披露すると思いました。これにより、多くのタスクが大幅に短縮されます(特に条件付き置換)。

ii
-
+`(.)\1|0

(.)-|(\d)(\d)
-$1$3$2
12
i3
23
i1
31
i2
)`(\d)i
i$1
^\D*$
$&0

Retinaは、正規表現ベースのプログラミング言語です。ソースコードはステージにグループ化できます。各ステージは2行で構成され、1行目には正規表現(および場合によっては構成)が含まれ、2行目には置換文字列が含まれます。その後、ステージは順番にSTDINに適用され、最終結果がSTDOUTに出力されます。

-sコマンドラインスイッチを使用して、上記をソースファイルとして直接使用できます。ただし、各行を個別のファイルに入れることもできるため、スイッチはカウントしません(その後、改行では15バイトが失われますが、追加のファイルでは+15を追加します)。

説明

このソリューションの新しい点)は、最後から2番目の段階です。これにより、マルチステージループが閉じます。一致するものはありません(つまり、ループは最初の段階で暗黙的に開始されます。したがって、最初の7つのステージは、7つすべてのパスが結果の変更を停止するまで繰り返されます。これらの7つのステージは、ストリング内の行列の数を徐々に減らし、フェーズを結合するさまざまな変換を単に実行します。最終結果に到達すると、7つのパターンのいずれもこれ以上一致せず、ループは終了します。その後、結果にまだ数字がない場合は0を追加します(上記の段階では、結果を含むすべてのIDが単純にドロップされるため)。

個々のステージが行うことは次のとおりです。

ii
-

すべてのペア兼ね備えiへの-位相の文字を低減することができます。

+`(.)\1|0
<empty>

2つの連続する同一の文字が残っている場合、それは2つ--または2つの同一のマトリックスです。どちらの場合でも、それらを掛け合わせることでアイデンティティが得られます。ただし、IDは必要ないため、すべてを削除し、明示的なID(0s)も削除します。この段階は+、結果が変化しなくなるまで繰り返されます。これにより123321、次のステップで数字のすべてのペアが異なると仮定できるように、完全に解決されるようになります。

(.)-|(\d)(\d)
-$1$3$2

これは、実際には1つの2つの別々の変換です(golfitudeの場合)。なお、第1の代替的なマッチが、場合に$2及び$3空で、2つ目一致する場合は$1空です。したがって、これは次の2つのステップに分解できます。

(\d)(\d)
-$2$1

これにより、すべての数字のペアがスワップされ、マイナス記号が追加されます。我々はすべて削除以来0の、すべて同一ペアを、これが唯一の一致します122331213213。この手順は奇妙に思えるかもしれませんが、後で処理できないケースは次の反復でここで交換されるため、これらのケースの半分しかチェックできません。

上記の段階の他の部分は次のとおりです。

(.)-
-$1

これにより-、符号が徐々に左に移動します(反復ごとに1ポジション)。最終的にそれらがすべて隣り合うようにこれを行い、前のステップで解決されます。

12
i3
23
i1
31
i2

これらの3つの段階では、3組の製品を単純に解決します。上記で述べたように、これは関連するケースの半分のみをキャッチしますが、残りの半分は、前のステップですべてのペアを交換した後の次の反復で処理されます。

)`(\d)i
i$1

これがループの最後の段階です。-を除いて、左にシフトするものに似ていiます。主な違いは、これiは数字のみと交換することです。私が使用(.)iした場合、1 つ-iまたはi-2つが無期限にスワップされ、プログラムが終了しない場合に取得します。したがって、これはそれらを-標識の右側にのみ交換します。これで十分です-すべてが-ありi、ある時点で一緒に表示される限り、それらは正しく解決できます。

^\D*$
$&0

最後のステップ(ループ外)。常にすべてのIDを削除したため、結果が実際にID(フェーズの倍数)である場合は、出力に必要な数字がもうないので、追加し直します。

例として、すべての中間形式0223202330203313021301011023230323(変更を実行しないスキップステージ)は次のとおりです。

0223202330203313021301011023230323

321321312        # Remove identities
-23-31-12-132    # Swap all pairs
-23-31-i3-132    # Resolve 12
-i1-31-i3-132    # Resolve 23
-i1-i2-i3-132    # Resolve 31
-i-1i-2i-3-312   # Move - to the left and swap pairs
-i-1i-2i-3-3i3   # Resolve 12
-i-i1-i2-3-i33   # Move i to the left
-i-i1-i2-3-i     # Remove identities
--ii-1i-2-3i     # Move - to the left
--ii-i1-2-i3     # Move i to the left
----i1-2-i3      # Resolve ii
i1-2-i3          # Remove identities
i-1-2i3          # Move - to the left
i-1-i23          # Move i to the left
-i-1i-32         # Move - to the left and swap pairs
-i-i1-32         # Move i to the left
--ii-1-23        # Move - to the left and swap pairs
--ii-1-i1        # Resolve 23
----1-i1         # Resolve ii
1-i1             # Remove identities
-1i1             # Move - to the left
-i11             # Move i to the left
-i               # Remove identities. Now the loop can't change this any longer.
-i0              # Fix the result by adding in the 0.

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