【问题标题】:How to find modulus patterns using Mathematica如何使用 Mathematica 查找模数模式
【发布时间】:2011-09-27 03:59:03
【问题描述】:

有没有办法找到整数列表的最低模数?我不确定如何正确表达,所以我将举例说明。

我想输入一个列表 (mod x) 并输出“相同”列表,模数 y ({0, 4, 6, 10, 12, 16, 18, 22} (mod 24)与{0, 4} (mod 6)基本相同。

感谢您的所有帮助。

【问题讨论】:

  • 我有点困惑。取模时信息会丢失。因此,在取模 x 列表后,您通常无法恢复列表模 y,例如当 x 和 y 互质时。你能解开我的困惑吗?
  • @Ziga 整数列表的“最低模数”是多少?
  • 很难说没有听起来太混乱:) 我试图在下面的评论中澄清。
  • 你真的必须定义你的“平等”。 {0, 4, 6, 10, 12, 16, 18, 22} 和 {0, 4} 在什么意义上相等?是否存在一个满足以下关系的列表 O? O mod 24 == {0, 4, 6, 10, 12, 16, 18, 22} 和 O mod 6 == {0, 4},删除所有重复项,您是否在寻找最小的 O?

标签: wolfram-mathematica


【解决方案1】:

您正在寻找一组算术序列。我们会考虑你的例子

ee = {0, 4, 6, 10, 12, 16, 18, 22};

其中有两个这样的序列,一个例子有四个。

ff = {0, 3, 7, 11, 17, 20, 24, 28, 34, 37, 41, 45};

在第二个中,我们从 {0,3,7,11} 开始,然后增加 17。那么从第 n 项到第 n+1 项的一般方法是什么?如果该集合有 k 个序列(对于 ee,k=2,对于 ff,k=4)然后将模数添加到第 n-k+1 项。什么是模数?这是第 n 项和第 n 项之间的差异。

把这些放在一起并假设我们知道 k(我们一般不知道,但我们会解决的)我们有一个形式 f(n+1)=f(n-k+1) + (f(n)-f(nk))。所以我们需要找到一个递归(如果存在的话),检查它的形式是否正确,如果是,则进行后期处理。

这是执行所有这些操作的代码。请注意,它实际上解决了 k。

findArithmeticSequences[ll : {_Integer ..}] := With[
  {rec = FindLinearRecurrence[ll]},
  {Take[ll, Length[rec] - 1], ll[[Length[rec]]]} /;
   ListQ[rec] &&
    (rec === {1, 1, -1} || MatchQ[rec, {1, 0 .., 1, -1}])
  ]

(纯函数的爱好者可能更喜欢下面的变体。失败案例的处理方式略有不同,没有令人信服的理由。)

findArithmeticSequences2[ll : {_Integer ..}] :=
 If[ListQ[#] &&
     (# === {1, 1, -1} || MatchQ[#, {1, 0 .., 1, -1}]), {Take[ll, 
      Length[#] - 1], ll[[Length[#]]]}, $Failed] &[
  FindLinearRecurrence[ll]]

测试:

In[115]:= findArithmeticSequences[ee]

Out[115]= {{0, 4}, 6}

In[116]:= findArithmeticSequences[ff]

Out[116]= {{0, 3, 7, 11}, 17}

请注意,可以通过多项式分解“几乎”解决此类问题(如果输入末尾没有部分序列)。例如,多项式

In[117]:= poly = Plus @@ (x^ee)

Out[117]= 1 + x^4 + x^6 + x^10 + x^12 + x^16 + x^18 + x^22

影响因素

(1+x^4)*(1+x^6+x^12+x^18)

以易于查看的方式包含所需的信息。不幸的是,出于这个特定目的,Factor 会超出这一点,并在此过程中掩盖信息。

我一直想知道是否可能有一种信号处理方式来处理这类事情,例如通过 DFT。但是我什么都没想到。

丹尼尔·利希特布劳

【讨论】:

  • 哇,谢谢!它几乎按照我想要的方式工作。你的方法有点“过于严格”。如果 'FindLinearRecurrence' 没有找到任何重复,它不会返回任何有用的东西。我已经稍微修改了你的方法,所以它更适合我的需要。我希望你不要介意。这是我的代码。我有一种感觉,它必须涉及重复,我只是没有足够的 Mathematica 经验来实现它。再次感谢您的宝贵时间!
【解决方案2】:

哇,谢谢丹尼尔!它几乎按照我想要的方式工作。你的方法有点“过于严格”。如果 'FindLinearRecurrence' 没有找到任何重复,它不会返回任何有用的东西。我已经稍微修改了你的方法,所以它更适合我的需要。我希望你不要介意。这是我的代码。

findArithmeticSequences[ll_List] := Module[{rec = FindLinearRecurrence[ll]}, If[! MatchQ[rec, {1, 0 ..., 1, -1}], Return[ll], Return[{ll[[Length[rec]]], Take[ll, Length[rec] - 1]}]; ]; ];

我觉得它必须涉及重复,我只是没有足够的 Mathematica 经验来实现它。再次感谢您的宝贵时间!

【讨论】:

    【解决方案3】:

    Mod 是可列出的,您可以通过DeleteDuplicates 删除重复元素。所以

    DeleteDuplicates[Mod[{0, 4, 6, 10, 12, 16, 18, 22}, 6]]
    (*
    -> {0,4}
    *)
    

    【讨论】:

    • 您的意思是写:DeleteDuplicates[Mod[Mod[{0, 4, 6, 10, 12, 16, 18, 22}, 24], 6]]
    • @David 我知道输入已经被采用了 mod 24,所以不需要再次。但我想这个问题(和例子)有点不清楚。
    • 我明白了。但我仍然对 Ziga 正在寻找什么感到困惑。
    • 感谢您的所有回答。为了进一步澄清,我试图找到最低的'y',以便结果列表(mod 'y')与原始列表(mod x)“相等”。在上面的示例中,'y=6' 是一种选择,但 'y=3' 甚至更好,因为它会导致 '{0, 1} (mod 3)'。 'y=2',即 '{0} (mod 2)' 不好,因为在原始列表中缺少一些偶数。
    猜你喜欢
    • 2020-01-06
    • 2017-07-12
    • 1970-01-01
    • 2014-04-28
    • 2011-02-10
    • 2017-04-01
    • 1970-01-01
    • 2016-11-16
    • 2014-10-20
    相关资源
    最近更新 更多