수레가없는 아이젠 슈타인 숫자 표현


9

내가 사용해야하는 프로젝트가 차 필드 형태의 구체적 숫자를a+b3a,bQ.

예를 들어 다음은 아이젠 슈타인 정수 의 소수입니다 .

세이지를 사용하고 싶지 않습니다. 통합 할 데이터 형식을 직접 작성하고 싶습니다 numpy. PARI는 유용하지만 Python과 호환되지 않습니다.

  • 이 객체에 대한 추가는 매우 분명합니다.
    (a1+b13)+(a2+b23)=(a1+a2)+(b1+b2)3
  • 곱셈은 ​​좀 더 섬세하지만 하드 코딩도 가능합니다
    (a1+b13)×(a2+b23)=(a1a23b1b2)+(a1b2+a2b1)3
  • 내 데이터 유형은 나누기를 수용해야합니다. 간단히하기 위해 역수를 보자.
    1a+b3=ab3a2+3b2

이러한 연산을 인코딩하는 자연스러운 매트릭스 기반 방법이 있습니까? C 의 관점에서 쓰여질 수있다 2×2 행렬?

(abba)

어쩌면 위에서 설명한 세 가지 작업으로 작업을 트리플로 하드 코딩 할 것입니다. 어떤 아이디어?

답변:


10

에 대한 a+b3 당신은 표현을 사용할 수 있습니다

(a3bba)
추가는 분명히 작동합니다. 곱셈을 위해, 당신은 확인할 수 있습니다
(a13b1b1a1)(a23b2b2a2)=(a1a23b1b23(a1b2+b1a2)a1b2+b1a2a1a23b1b2)
이는 표현을 보존하므로 고리 동형이됩니다.

행렬의 결정자를 취하는 것은 (제곱) 규범을 제공합니다 a2+3b2따라서 역수는 예상 한대로 역행렬에 해당합니다.

이미 triples 사용을 고려 했는데 정수와 공통 분모를 사용한다고 가정합니다. 이 접근법은 매트릭스 표현에도 유용 할 수 있습니다.

업데이트 : 매트릭스 표현에 대한 일반적인 방법은 컴패니언 매트릭스를 사용합니다 . 예를 들어,a+bω 대신에 ω=exp(2πi3)따라서 ω2+ω+1=0. 동반자 매트릭스ω 이다 (0111), 이것은 다음과 같은 모든 관련 링 작업에서 작동합니다 ω그 자체. 물론이야,1 로 표현 될 수있다 (1001); 그러므로의 행렬 표현a+bω 이다

(abbab)
이것이 고리 동형인지 확인하고 싶을 수도 있습니다. 또한, 이것은보기 쉽다. 곱셈의 경우 해당 공식은
(a1+b1ω)(a2+b2ω)=(a1a2b1b2)+(a1b2+b1a2b1b2)ω(a1b1b1a1b1)(a2b2b2a2b2)=(a1a2b1b2(a1b2+b1a2b1b2)a1b2+b1a2b1b2a1a2a1b2b1a2)

2

부동 소수점 오류가 발생할 수 있으므로 모든 것에 대해 정확한 합리적인 산술을 원한다고 추측합니다. 1/z 에 없다 Q[3] 설사 z입니다. 이를 위해 SymPy 패키지를 살펴볼 수 있습니다 . 합리적 데이터 유형을 직접 사용하지 않으면 직접 롤링 한 버전에 영감을 줄 수 있습니다. 그런 다음 선택한 합리적인 숫자 유형 위에 2 차 필드 유형을 작성할 수 있습니다.

필드의 요소를 어떻게 표현하든 "매직 메서드"를 사용하여 파이썬에서 연산자를 오버로드 할 수 있습니다 . 파이썬에서 자신의 숫자 유형을 만드는 것에 대한 이 SO 게시물 을 참조하십시오 .

산술 연산이 그렇게 복잡하지 않기 때문에 2 차 필드의 요소 표현을 합리적인 숫자의 2 x 2 행렬 또는 합리적인 숫자 쌍으로 코딩하는 작업이 훨씬 더 많을 것이라고 생각하지 않습니다. 그러나 두 번째 접근법이 더 빠를 것이라고 생각합니다.


1
numpy가속 매트릭스 연산 의 실제 성능 과 사용자 정의 데이터 형식의 성능을 비교하는 것이 흥미로울 수 있습니다 . 승자가 무엇인지 확실하지 않습니다.
ccorn

그렇습니다 .numpy는 C 측에서 많은 Cython + 수작업으로 최적화되어 작업 속도가 빨라졌습니다. 동일한 효과를 얻으려면 그 중 일부를 다시 실행해야합니다. 그럼에도 불구하고 기능이 최우선이되어야하며 나중에 속도에 대해 걱정할 수 있습니다.
Daniel Shapero
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.