Pauli Matrislerini Çarpma


12

Pauli matrisleri kuantum fiziği çok sık görünen 2x2 matrisleri kümesidir (hayır, bu meydan okuma için herhangi kuantum fiziği bilmek gerekmez). Kümeyi kümeye dahil edersek, dört matris şunlardır:

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

Çarparak kompleks aşamalardan biri ile çarpılabilir, ancak her zaman, bir başka Pauli matris verecek bu iki 1, i, -1, -i. Örneğin ,.σ1σ3 = -iσ2

Göreviniz birkaç Pauli matrisini çarpıp ortaya çıkan matrisi ve fazı döndürmektir. Giriş , matrisleri temsil etmek 0için boş olmayan bir basamak dizisi olarak verilecektir . Çıkış Elde edilen matris için bir tek basamaklı içeren bir dizi, isteğe bağlı olarak önce olmalıdır , ya da (fazı belirttiği için ).3σ0σ3i--i--1

STDIN (veya en yakın alternatif), komut satırı bağımsız değişkeni veya işlev bağımsız değişkeni ile girdi alarak ve sonucu STDOUT (veya en yakın alternatif), işlev dönüş değeri veya işlev (çıkış) parametresi aracılığıyla çıktı alarak bir program veya işlev yazabilirsiniz.

Pauli matrisleriyle ilgili yerleşik (veya 3. taraf) özellikler kullanmamalısınız.

Bu kod golf, en kısa cevap (bayt cinsinden) kazanır.

Test Durumları

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

3
Soyut cebir etiketini ekledim çünkü bu aslında genelleştirilmiş kuaterniyon grubundaki kelimelerin basitleştirilmesini istiyor .
Peter Taylor

Yanıtlar:


3

Pyth, 47 bayt

Sanırım bu hala golf edilebilir. Ama CJam'ı çok yeniyor.

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

Çevrimiçi deneyin: Gösteri veya Test Paketi

açıklama

Elde edilen matris türünü belirlemek tüm sayıları basitçe xoringlemektedir.

2 matris çarpma sırasında A*Bmatrislerin olmayan ise, faz değişimleri σ0ve A != 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

Tabii ki aynı algoritmayı kullanırsam 44'üm var, ki bu aslında Sp300'dür.
Doktor,

9

Python 2, 108 89 87 86 bayt

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`

(Yardım için @grc ve @xnor'a teşekkürler)

açıklama

Katsayıyı ve temel matrisi böleriz. Yalnızca temel matrise odaklanırsak, bu çarpım tablosunu alırız (örneğin 13, -i2koyduk 2):

  0123

0 0123
1 1032
2 2301
3 3210

ki bu sadece bitsel xor ile aynı şey olur.

Şimdi katsayılara odaklanalım. Biz izin verirsek 0123göstermek 1,i,-1,-isırasıyla elde ederiz:

  0123

0 0000
1 0031
2 0103
3 0310

Bunun için önce m*ysol sütuna ve üst sıraya dikkat ederek numaralardan birinin 0 olup olmadığını kontrol ederiz . Eklemek (m-y)%3sonra verir:

  0123

0 0000
1 0021
2 0102
3 0210

ki 2bunun yerine3 . Bunu gerçekleştirerek açıklıyoruz *3/2.

İndeksleme için, dizeyi alırsak ve elde ettiğimiz "--i"endekslerden başlayarak her ikinci karakteri seçersek fark 0123ederiz "-i","-","i","".


Güzel dize dilimleme, ben yaklaşık unutmuştum bu . Sana yapabileceğine inanıyorum 3-n%4olarak ~n%4. m*y and(m-y)%3*3/2Sihirli bir dizede daha kısa ifade edebileceğinizden şüpheleniyorum , ancak ilk denemem 877449216>>2*m+8*ysadece bağlı. Ayrıca oldukça cebirsel bir formül var, eğer Y=m^yifade ise (m-y)*(y-Y)*(Y-m)/2, ama bu uzun.
xnor

@xnor Oh ~, güzel - off-by-one beni rahatsız ediyordu: / Eminim ki m*y and(m-y)%3*3/2kısaltılabilirim, ama bütün gece geçirdim ve hiçbir yere varamadım ... zaman var. Belki de özgürlüğe sahip olmama mod 4 yardımcı olabilir.
Sp3000

6

Retina , 77 bayt

Bu fırsatı yeni bir Retina özelliğini göstermek için kullanacağımı düşündüm: çok aşamalı döngüler. Bu, birçok görevi önemli ölçüde kısaltmalıdır (özellikle koşullu değiştirme).

ii
-
+`(.)\1|0

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

Retina benim kendi regex tabanlı programlama dilim. Kaynak kodu aşamalar halinde gruplandırılabilir: her aşama, birincisinin normal ifadeyi (ve potansiyel olarak bazı yapılandırmayı) içerdiği ve ikinci satırın yerine geçen dize olduğu iki satırdan oluşur. Daha sonra aşamalar sırayla STDIN'e uygulanır ve nihai sonuç STDOUT'a yazdırılır.

Yukarıdakileri doğrudan bir kaynak dosyası olarak -s komut satırı anahtarıyla . Ancak, anahtarı saymıyorum, çünkü her satırı ayrı bir dosyaya da koyabilirsiniz (daha sonra yeni satırlar için 15 bayt kaybedersiniz, ancak ek dosyalar için +15 ekleyin).

açıklama

Bu çözümle ilgili yeni şey ), sondan bir önceki aşamada. Bu, çok aşamalı bir döngüyü kapatır. Eşleşme yok( , yani döngü ilk aşamada dolaylı olarak başlar. Bu nedenle, ilk 7 aşama bunların 7'sinden tam geçiş sonucu değiştirmeyi durdurana kadar tekrarlanır. Bu 7 aşama basitçe ipdeki matris sayısını yavaş yavaş azaltan ve fazları birleştiren çeşitli dönüşümler gerçekleştirir. Nihai sonuca ulaştığımızda, yedi desenin hiçbiri artık eşleşmez ve döngü sona erer. Daha sonra, sonuçta henüz bir rakam yoksa 0 ekleriz (yukarıdaki aşamalar sonuç dahil tüm kimlikleri düşürür).

Bireysel aşamalar şunları yapar:

ii
-

Tüm çiftleri birleştirir iiçine -faz karakterleri azaltmak için.

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

Şimdi iki ardışık özdeş karakter kaldıysa, ya bir ya --da iki özdeş matristir. Her iki durumda da, onları çoğaltmak kimliği verir. Fakat kimliklere ihtiyacımız yok, bu yüzden hepsini ve açık kimlikleri de kaldırıyoruz 0. +Sonuç aşaması durana kadar bu aşama kendi içinde tekrarlanır . Bu 123321, bir sonraki adımın tüm basamak çiftlerinin farklı olduğunu varsayabileceği gibi tamamen çözülmesini sağlar .

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

Bu aslında birde iki ayrı dönüşümdür (golfitude için). İlk alternatifin $2ve $3ile eşleşmesi ve ikincisinin eşleşmesinin $1boş olması gerektiğini unutmayın. Yani bu şu iki adıma ayrılabilir:

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

Bu, tüm basamak çiftlerini değiştirir ve eksi işareti ekler. Hepimizin kaldırıldı yana 0s ve tüm özdeş çiftleri, bu sadece maç olacak 12, 23, 31, 21, 32, 13. Bu adım tuhaf görünebilir, ancak daha sonra bu davaların sadece yarısını kontrol etmeme izin veriyor, çünkü işleyemediğim kişiler bir sonraki yinelemede değiştirilecek.

Yukarıdaki aşamanın diğer kısmı:

(.)-
-$1

Bu, -işaretleri yavaşça sola doğru hareket ettirir (her yineleme için bir konum). Bunu, sonuçta hepsi yan yana olacak ve önceki adımda çözülecek şekilde yaparım.

12
i3
23
i1
31
i2

Bu üç aşama şimdi üç çift ürünü çözmektedir. Yukarıda söylediğim gibi, bu ilgili davaların sadece yarısını yakalayacaktır, ancak diğer adım, bir önceki adımda tüm çiftleri değiştirdikten sonra bir sonraki yinelemede ele alınacaktır.

)`(\d)i
i$1

Bu, döngünün son aşamasıdır. Bunun -haricinde sola kaymaya benzer i. Temel fark, bunun isadece rakamlarla değişmesidir. Eğer (.)io zaman bir -iya i-da iki tane aldığım durumlarda süresiz olarak değiştirilir ve program sona ermez. Bu sadece onları -işaretlerin sağına değiştirir . Bu yeterlidir - boyu kadar -ve ibir noktada birlikte görünür, bunların doğru çözülebilir.

^\D*$
$&0

Son adım (döngünün dışında). Tüm kimlikleri her zaman sildiğimizi unutmayın, bu nedenle sonuç aslında kimlikse (bir faz), çıktıda gerekli basamağa artık sahip olmayacağız, bu yüzden geri ekliyoruz.

Örnek olarak, tüm ara formları 0223202330203313021301011023230323(herhangi bir değişiklik yapmayan aşamaları atlamak):

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.