2011-07-02 6 views
2

整数のリストの最小モジュラスを見つける方法はありますか?私はそれを正しく言う方法がわからないので、例を明確にするつもりです。Mathematicaを使ってモジュラスパターンを見つける方法

リスト(mod x)を入力し、同じリスト、モジュラスy(< x)を出力したいと思います。たとえば、リスト{0, 4, 6, 10, 12, 16, 18, 22} (mod 24)は、本質的には{0, 4} (mod 6)と同じです。

ありがとうございました。

+0

少し混乱します。モジュラスを取ると、情報は失われます。したがって、xを法とするリストを取った後では、一般にlist mod yを復元することはできません。 xとyが互いに素であるとき。あなたは私の混乱を解消できますか? –

+1

@Ziga整数のリストの「最小モジュラス」とは何ですか? – DavidC

+0

あまりにも混乱を招くことなく言うことは難しい:)私は以下のコメントで明確にしようとした。 – Ziga

答えて

3

あなたは一連の算術演算シーケンスを探しています。あなたの例を考えてみましょう

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

このようなシーケンスが2つあり、そのうちの4つの例があります。我々は{0,3,7,11}で開始し、そのように、N + 1番目にn番目の用語から取得する一般的な方法は何である17により増加この第一

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

?集合がk個の系列(eeに対してk = 2、ffに対して4)を有する場合、n-k + 1項に法を加える。モジュラスとは何ですか?これはn番目とn-k番目の用語の違いです。

これをまとめると、k(一般的ではありませんが、それになります)を知っていると仮定すると、f(n + 1)= f +(f(n)-f(n-k))である。だから、再発(存在する場合)を見つけて、それが正しい形式であることを確認し、もしあれば後処理する必要があります。

これはすべてこれを行うコードです。実際にはそれが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} 

。なお、多項式分解(入力が最後に部分シーケンスを持たない場合)によってこのような問題を「ほとんど」行うことができます。参照しやすい方法で、必要な情報が含まれてい

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

に例えば、多項式

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

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

が要因。残念なことに、この特定の目的のために、要因はこの点を超えて要因となり、そうする際に情報を不明瞭にします。

このようなことを行う信号処理方法があるかどうかは疑問です。 DFTを介して。しかし、私は何も思い付いていない。

ダニエルLichtblau

+0

うわー、ありがとう!それは私が望むのとほぼ同じように機能します。あなたの方法はちょっとだけ "あまりにも制限的"です。 'FindLinearRecurrence'が再帰を見つけられない場合は、何も役に立ちません。私は少しあなたのメソッドを変更したので、それは私のニーズに適しています。あなたが気にしないことを願っています。ここに私のコードです。 私は再発を伴わなければならないと感じましたが、Mathematicaを実装するのに十分な経験がありません。あなたの時間をもう一度ありがとう! – Ziga

0

Modがリストされ、重複する要素をDeleteDuplicatesで削除できます。したがって

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

あなたは 'DeleteDuplicates [Mod [Mod [{0、4、6、10、12、16、18、22}、24]、6]]'を書くことを意味しましたか? – DavidC

+0

@David私は入力がすでにmod 24になっていることを理解しましたので、再度必要はありません。しかし、私は疑問(と例)から少し不明であると思います。 – acl

+1

私は参照してください。しかし、私はまだジーガが探しているものについて困惑しています。 – DavidC

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でこれを実装するには十分な経験がありません。あなたの時間をもう一度ありがとう!

関連する問題