2011-07-02 4 views
2

정수 목록의 최소 계수를 찾는 방법이 있습니까? 어떻게 올바르게 말 할 지 모르겠다. 그래서 나는 예제를 명확히 할 것이다.Mathematica를 사용하여 계수 패턴을 찾는 방법

목록 (mod x)을 입력하고 "같은"목록, 모듈 y (< x)를 출력하고 싶습니다. 예를 들어, 목록 {0, 4, 6, 10, 12, 16, 18, 22} (mod 24)은 기본적으로 {0, 4} (mod 6)과 같습니다.

도움 주셔서 감사합니다.

+0

조금 혼란 스럽네요. 계수를 취하면 정보가 손실됩니다. 따라서리스트 x를 취한 후에리스트 mod y를 복구 할 수 없습니다. x와 y가 서로 소인 일 때. 내 혼란을 치울 수 있니? –

+1

@Ziga 정수 목록의 "최저 계수"란 무엇입니까? – DavidC

+0

너무 혼란스럽지 않고 말하기 힘들다 :) 나는 아래의 설명에서 명확히하려고 노력했다. – Ziga

답변

3

일련의 산술 시퀀스를 찾고 있습니다. 우리는 당신의 예를 들어이 같은 시퀀스, 그 중 넷과 예제가

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} 다음 그래서 N + 1 번째에 n 번째 임기에서 얻을 수있는 일반적인 방법은 무엇입니까 (17)에 의해 증가? 집합에 k 개의 시퀀스 (ee의 경우 k = 2, ff의 경우 4)가있는 경우 n-k + 1 번째 항에 모듈러스를 추가합니다. 계수는 무엇입니까? 그것은 n 번째와 n-kth의 차이입니다.

이것을 종합하면 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}]) 
    ] 

(순수 기능 Afficionados 아래의 변형을 선호 할 수도 실패 사례가 더 매력적인 이유, 약간 다르게 처리됩니다.).

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 

요인. 유감스럽게도이 특별한 목적을 위해 Factor는이 시점을 넘어서는 요인으로 작용하여 정보를 흐리게 만듭니다.

이런 종류의 문제에 대해 신호 처리 방법이 있을지 궁금합니다. DFTs를 통해. 하지만 나는 아무것도 얻지 못했습니다.

다니엘 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를 구현할 충분한 경험이 없습니다. 시간 내 주셔서 다시 한 번 감사드립니다!

관련 문제