乘以Pauli矩阵


12

泡利矩阵是一组其在量子物理学非常普遍出现的2x2矩阵(不,你不需要知道这个挑战任何量子物理)。如果我们在集合中包括身份,则四个矩阵为:

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

乘以二这些将永远给另一个保利矩阵,尽管它可以通过复杂的阶段之一相乘1i-1-i。例如,。σ1σ3 = -iσ2

您的任务是将多个Pauli矩阵相乘并返回结果矩阵和相位。输入将被给定为数字的非空字符串03表示矩阵来。输出应该含有单个数字迭代矩阵的字符串,任选地被前面,或者以指示相(是)。σ0σ3i--i--1

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。

您不得使用任何与Pauli矩阵相关的内置(或第三方)功能。

这是代码高尔夫球,最短的答案(以字节为单位)获胜。

测试用例

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

3
我添加了abstract-algebra标记,因为这本质上是要求简化广义四元数组中的单词。
彼得·泰勒2015年

Answers:


3

Pyth,47个字节

我想这仍然可以打高尔夫球。但是,它比CJam大很多。

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

在线尝试:演示测试套件

说明

确定结果矩阵类型就是对所有数字进行异或运算。

当两个矩阵相乘时A*B,如果非矩阵为σ0和,则相位改变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

当然,如果我使用相同的算法(本质上就是Sp300),则我有44个。
Optimizer

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

恰好与按位异或相同。

现在让我们集中讨论系数。如果我们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"并从索引开始选择第二个字符,则会0123得到"-i","-","i",""


尼斯字符串的切片,我已经忘记了 这个。我相信你能做到3-n%4~n%4。我怀疑您可以m*y and(m-y)%3*3/2用魔术字串来表达较短的内容,但我的第一次尝试877449216>>2*m+8*y只受到限制。还有一个漂亮的代数公式,如果Y=m^y,表达式是(m-y)*(y-Y)*(Y-m)/2,但是很长。
xnor 2015年

@xnor哦~,太好了–离我很近://我很确定m*y and(m-y)%3*3/2也可以将它缩短,但是我整夜都没花任何时间……如果我愿意,我会再来的有时间。也许我拥有自由模式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

视网膜是我自己的基于正则表达式的编程语言。源代码可以分为多个阶段:每个阶段由两行组成,其中第一行包含正则表达式(可能包含某些配置),第二行是替换字符串。然后将这些阶段按顺序应用于STDIN,并将最终结果打印到STDOUT。

您可以使用-s命令行开关将以上内容直接用作源文件。但是,我没有算在内,因为您还可以将每行放在一个单独的文件中(然后,换行符会丢失15个字节,而其他文件会加+15)。

说明

此解决方案的新事物是)倒数第二阶段。这将关闭多级循环。没有匹配项(,这意味着循环隐式开始于第一阶段。因此,重复前7个阶段,直到全部通过所有这7个阶段都停止更改结果为止。这7个阶段仅执行各种转换即可逐渐减少字符串中矩阵的数量并合并阶段。一旦达到最终结果,这七个模式便不再匹配,循环结束。然后,如果结果中还没有数字,我们会附加一个0(因为上述阶段只是删除了所有身份,包括结果)。

以下是各个阶段的工作:

ii
-

将所有对i-,以减少相位字符。

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

现在,如果剩下两个连续的相同字符,则为一个--或两个相同的矩阵。在任何一种情况下,将它们相乘即可得出身份。但是我们不需要身份,因此我们只需删除所有身份以及显式身份(0s)。重复此阶段,+直到结果停止更改为止。这样可以确保123321完全解决类似问题,从而使下一步可以假定所有数字对都是不同的。

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

实际上,这是一个单独的两个转换(用于高尔夫度)。请注意,如果第一个选项匹配,$2并且$3为空,并且第二个匹配项$1为空。因此,可以将其分解为以下两个步骤:

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

这只是交换所有数字对并添加减号。因为我们删除了所有0S和所有相同的对,这将只匹配122331213213。这一步似乎很奇怪,但是它允许我以后只检查其中一半,因为我无法处理的情况将在下一次迭代中交换。

上述阶段的另一部分是:

(.)-
-$1

这会逐渐将-符号一直移到左侧(每次迭代一个位置)。我这样做是为了最终使它们彼此相邻并在较早的步骤中得到解决。

12
i3
23
i1
31
i2

这三个阶段现在只需解决三对产品。就像我在上面说的那样,这只会捕获一半的相关案例,但是另一半将在上一步交换所有对之后的下一次迭代中得到解决。

)`(\d)i
i$1

这是循环的最后阶段。-除了以外,它类似于向左移动的那个i。主要区别在于,这一位i仅与数字交换。如果我使用了(.)ithen,那么在我得到a -ii-2的情况下,它们将被无限期交换,并且程序不会终止。因此,这仅将它们交换到-标志的右侧。这是不够的-只要所有-,并i在某些时候一起出现,它们可以被正确解析。

^\D*$
$&0

最后一步(循环之外)。请记住,我们总是删除所有身份,因此,如果结果实际上是身份(乘以一个阶段),则输出中将不再有所需的数字,因此将其添加回去。

例如,以下是所有的中间形式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.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.