在Mathematcia

时间:2018-05-08 15:38:37

标签: list wolfram-mathematica

出于科学目的(代码研究)我使用Mathematica来枚举一些线性递归的所有周期序列。作为示例命令

Table[{Mod[i * 2^n + j * 4^n + k * 6^n, 7] },{i, 0, 5}, {j, 0, 5}, {k, 0, 5}, {n, 0, 5}]

允许在7阶(或mod 7)的有限域中枚举线性递归序列的所有216个不同周期序列,其特征多项式的根为2,4和6.它产生的前五个序列是:

{0, 0, 0, 0, 0, 0}, {1, 6, 1, 6, 1, 6}, {2, 5, 2, 5, 2, 5}, {3, 4, 3, 4, 3, 4}, {4, 3, 4, 3, 4, 3}, …

我有两个问题:

i)当i=0,j=0,k=0;第二个i=0,j=0,k=1,第三个i=0,j=0,k=2,第三个时{{0, 0, 0, 0, 0, 0}, {0, 0, 0}}, {{1, 6, 1, 6, 1, 6}, {0, 0, 1}}, {{2, 5, 2, 5, 2, 5}, {0, 0, 2}} , etc. 等时获得第一个序列。有没有办法将这些数字与它们生成的序列连接起来,这样我将了解这些参数,因此能够在以后(如果需要)生成特定序列?那就是我希望输出就像这样

{1, 6, 1, 6, 1, 6}

ii)在上面的例子中(3阶线性递归和mod 7),获得的序列数(216)可以手动控制;但是当线性递归的次序高于3并且该场具有高于7的特征时,这个数字会迅速增长。并且,在这些情况下,产生的大多数序列对我来说都不感兴趣。我想如果我能添加一条读取输出的指令(获得的序列)并且会说“我只想要序列使得它的产品”,我可以扔掉至少99%不感兴趣的序列。元素是216(比如)“:从上面的五个序列中只剩下{1, 6, 1, 6, 1, 6},因为1x6x1x6x1x6 = 216 $;或者“我只希望序列使其元素的乘积为216或1000(比如说)”来自{2, 5, 2, 5, 2, 5}f = h5py.File('myfile.hdf5') d = f.require_dataset('/data', shape=x.shape, dtype=x.dtype) da.store(x, d) 之上的五个序列,因为1x6x1x6x1x6 = 216和2x5x2x5x2x 5 = 1000。

有可能这样做吗?我尝试了一些列表和表操作,但没有成功。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

这是第一部分..

Flatten[Table[{Table[Mod[i*2^n + j*4^n + k*6^n, 7], {n, 0, 5}], {i, j,
     k}}, {i, 0, 5}, {j, 0, 5}, {k, 0, 5}], 2]
  

{{{0,0,0,0,0,0},{0,0,0}},{{1,6,1,6,1,6},{0,0,      1}},{{2,5,2,5,2,5},{0,0,2}},{{3,4,3,4,3,4},{0,0,      3}},...

更好的方法:

{Table[Mod[#.{2, 4, 6}^n, 7], {n, 0, 5}],#} & /@ Tuples[Range[0, 5], {3}]

使用指定产品查找案例的示例:

Reap[Do[
        s = Table[Mod[i*2^n + j*4^n + k*6^n, 7], {n, 0, 5}]; 
        If[Times @@ s == 81, Sow[{s, {i, j, k}}]],
     {i, 0, 5}, {j, 0, 5}, {k, 0, 5}]][[2, 1]]
  

{{{3,3,1,3,3,1},{1,2,0}},{{3,1,3,3,1,3},{2,1,      0}},{{1,3,3,1,3,3},{4,4,0}}}