出于科学目的(代码研究)我使用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。
有可能这样做吗?我尝试了一些列表和表操作,但没有成功。
提前谢谢。
答案 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}}}