生成沃尔什矩阵


22

一个Walsh矩阵是一种特殊的具有方阵在量子计算的应用程序(也可能是其他地方,但我只关心量子计算)。

沃尔什矩阵的性质

尺寸是2的相同的功率。因此,我们可以用2的指数是指这些矩阵这里,美其名曰W(0)W(1)W(2)...

W(0)定义为[[1]]

对于n>0W(n)看起来像:

[[W(n-1)  W(n-1)]
 [W(n-1) -W(n-1)]]

因此W(1)

[[1  1]
 [1 -1]]

并且W(2)是:

[[1  1  1  1]
 [1 -1  1 -1]
 [1  1 -1 -1]
 [1 -1 -1  1]]

模式还在继续...

你的任务

编写一个程序或函数,将整数作为输入nW(n)以任何方便的格式打印/返回。.svg只要是正确的,它就可以是一个数组数组,一个布尔值的扁平数组,一个图像,您可以为其命名。

禁止出现标准漏洞

几件事:

对于W(0)1甚至不需要包装一次。它可以仅仅是一个整数。

您可以对1个索引的结果进行查询- W(1)然后为[[1]]

测试用例

0 -> [[1]]
1 -> [[1  1]
      [1 -1]]
2 -> [[1  1  1  1]
      [1 -1  1 -1]
      [1  1 -1 -1]
      [1 -1 -1  1]]
3 -> [[1  1  1  1  1  1  1  1]
      [1 -1  1 -1  1 -1  1 -1]
      [1  1 -1 -1  1  1 -1 -1]
      [1 -1 -1  1  1 -1 -1  1]
      [1  1  1  1 -1 -1 -1 -1]
      [1 -1  1 -1 -1  1 -1  1]
      [1  1 -1 -1 -1 -1  1  1]
      [1 -1 -1  1 -1  1  1 -1]]

8 -> Pastebin

这是,因此每种语言中最短的解决方案是成功的!打高尔夫球快乐!



结果可以1索引吗?(如W(1)退货[[1]]W(2)退货[[1,1],[1,-1]......)
利奥

@Leo Yep,他们可以。编辑英寸
Khuldraeseth na'Barya

Answers:



10

MATL,4个字节

W4YL

在线尝试!

怎么运行的:

W       % Push 2 raised to (implicit) input
4YL     % (Walsh-)Hadamard matrix of that size. Display (implicit)

没有内置的:11个字节

1i:"th1M_hv

在线尝试!

运作方式

对于每个沃尔什矩阵W,下一个矩阵计算为[ W Ww ^ - w ^ ],由于是在挑战描述。该代码n从1×1矩阵[1]开始执行该操作。

1       % Push 1. This is equivalent to the 1×1 matrix [1]
i:"     % Input n. Do the following n times
  t     %   Duplicate
  h     %   Concatenate horizontally
  1M    %   Push the inputs of the latest function call
  _     %   Negate
  h     %   Concatenate horizontally
  v     %   Concatenate vertically
        % End (implicit). Display (implicit)

2
gh ...我在这里尝试使用kron。;)
烧杯


5

内置八度音阶18 17字节

@(x)hadamard(2^x)

在线尝试!

不带内置的八度56 51 47字节

function r=f(x)r=1;if x,r=[x=f(x-1) x;x -x];end

在线尝试!感谢@Luis Mendo提供-4。

带递归lambda的倍频程54 53 52 48字节

f(f=@(f)@(x){@()[x=f(f)(x-1) x;x -x],1}{1+~x}())

在线尝试!感谢这个答案这个问题的启发。


如果函数在文件中定义,end则不需要第二个。因此,您可以将其移至TIO的标头,从而将其从字节数中删除
Luis Mendo


4

Python 2中75 71个字节

r=range(2**input())
print[[int(bin(x&y),13)%2or-1for x in r]for y in r]

在线尝试!

沃尔什矩阵似乎与邪恶数字有关。如果x&y(按位和,基于0的坐标)是一个恶数,在矩阵中的值是1-1对可恶号码。比特奇偶校验计算int(bin(n),13)%2取自Noodle9此答案评论。


2
直观地,(x,y)处的符号翻转的次数与(x,y)在(2 ^ k×2 ^ k)矩阵的右下象限中存在递归级别的次数相同当x和y在第k位都为1时。利用这一事实,我们可以简单地计算1位x&y来确定翻转符号的次数。
Lynn

4

R61 56 53 50字节

w=function(n)"if"(n,w(n-1)%x%matrix(1-2*!3:0,2),1)

在线尝试!

递归地用Kronecker乘积计算矩阵,并返回1的n=0大小写(感谢Giuseppe指出了这一点,并感谢JAD帮助高尔夫球了初始版本)。

再次感谢Giuseppe,增加了-3个字节。


邓诺(Dunno)如果返回1而不是matrix(1)有效,那么如果可以,那就可以打下去,还有61字节的Reduce方法:试试吧!
朱塞佩

我也不确定n=0案例的格式,大多数其他答案都将其包装在[[1]]中,但不是全部...
Kirill L.

1
您可以替换matrix(1)t(1)
JAD

1
问题已被编辑。您可以返回整数而不是矩阵。
Khuldraeseth na'Barya

1
1-2*!3:0c(1,1,1,-1)三个字节短。
朱塞佩


2

JavaScript(ES6),77个字节

n=>[...Array(1<<n)].map((_,i,a)=>a.map((_,j)=>1|-f(i&j)),f=n=>n&&n%2^f(n>>1))

天真的计算开始0 <= X, Y <= 2**NW[N]。最简单的情况是当Xor或Y小于时2**(N-1),在这种情况下我们递归于X%2**(N-1)and Y%2**(N-1)。在这两种情况下X,并Y至少为2**(N-1)递归调用需要被否定。

如果要比较而不是比较XY少于2**(N-1)一个位掩码X&Y&2**(N-1),则当需要否决递归调用时,该位为非零;否则为零。这也避免了必须减少模数2**(N-1)

对于相同的结果,当然可以以相反的顺序测试这些位。然后,与其将每次我们坐标的位掩码加倍,不如将其减半,而是对结果进行XOR运算,从而最终结果0意味着没有否定和1意味着否定。




1

05AB1E,16个字节

oFoL<N&b0м€g®smˆ

在线尝试!

说明

oF                 # for N in 2**input do:
  oL<              # push range [1..2**input]-1
     N&            # bitwise AND with N
       b           # convert to binary
        0м         # remove zeroes
          €g       # length of each
            ®sm    # raise -1 to the power of each
               ˆ   # add to global array

我希望我知道一种计算汉明权重的较短方法。
1δ¢˜与的长度相同0м€g


1

外壳,13个字节

!¡§z+DS+†_;;1

在线尝试!

1个索引。

说明

!¡§z+DS+†_;;1
 ¡        ;;1    Iterate the following function starting from the matrix [[1]]
  §z+              Concatenate horizontally
     D               The matrix with its lines doubled
      S+†_           and the matrix concatenated vertically with its negation
!                Finally, return the result after as many iterations as specified
                 by the input (where the original matrix [[1]] is at index 1)



0

Python 2,49个字节

展示了使用其他库的几种方法。这依赖于Scipy中的内置功能:

lambda n:hadamard(2**n)
from scipy.linalg import*

在线尝试!

Python 2,65个字节

而这个只使用Numpy,并由Kronecker产品解决,类似于我的R回答

from numpy import*
w=lambda n:0**n or kron(w(n-1),[[1,1],[1,-1]])

在线尝试!


0

Stax,20 个字节

àΩ2┤â#╣_ê|ª⌐╦è│╞►═∞H

在staxlang.xyz上运行和调试它!

以为我会在一段时间后尝试挑战自己。非递归方法。与其他高尔夫语言竞争不太激烈...

解压缩(24字节)和说明

|2c{ci{ci|&:B|+|1p}a*d}*
|2                          Power of 2
  c                         Copy on the stack.
   {                  }     Block:
    c                         Copy on stack.
     i                        Push iteration index (starts at 0).
      {           }           Block:
       ci                       Copy top of stack. Push iteration index.
         |&                     Bitwise and
           :B                   To binary digits
             |+                 Sum
               |1               Power of -1
                 p              Pop and print
                   a          Move third element (2^n) to top...
                    *         And execute block that many times.
                     d        Pop and discard
                       *    Execute block (2^n) times
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.