Schönhage–Strassen 알고리즘에서 내부 링은 어떻게 선택됩니까?


9

Schönhage–Strassen 정수 곱셈 알고리즘을 구현하려고했지만 재귀 단계에서 걸림돌을 쳤습니다.

이 I 값이 와 비트 및 I를 계산하려는 X ^ 2 \ pmod를 2 ^ {n은 + 1} . 나는 원래 아이디어가 선택하는 줄 알았는데 K 있도록 4 ^ K \ GEQ 2N , 분할 XK ^ 2 각 조각 2 ^ {K-1} 비트 모듈로 작업하는 동안, SSA의 회선을 적용 2 ^ {2 ^ 케이} +1 , 값당 2 ^ k 비트의 용량을 가진 링 . 그러나 컨벌루션의 출력은 2n 비트 보다 약간 더 큽니다 (즉, > 2 ^ k엑스엑스2(모드2+1)케이4케이2엑스2케이2케이122케이+12케이2>2케이각 출력 값이 여러 제품의 합이므로 링당 용량보다 큰 출력 값당 비트 수) 작동하지 않습니다. 2 패딩의 추가 요소를 추가해야했습니다.

패딩에서 2의 추가 요소는 복잡성을 망칩니다. 재귀 단계가 너무 비쌉니다. 대신에게 에프()=lg+에프(2)=Θ(lglglg) 알고리즘, I는 결국 와 에프()=lg+에프(4)=Θ(lg2) 알고리즘.

Wikipedia에서 링크 된 몇 가지 참고 자료를 읽었지만이 문제가 어떻게 해결되는지에 대한 세부 사항을 살펴 보았습니다. 예를 들어, 2 의 거듭 제곱이 아닌 p에22케이+1 대해 modulo 2 ^ {p 2 ^ k} + 1 을 사용 하여 여분의 패딩 오버 헤드를 피할 수 있습니다 ...하지만 전원이 아닌 경우 남은 2 개의 요인으로, 개수를 두 배로 늘리지 않으면 Cooley-Tukey를 적용 할 수 없습니다. 또한 p 는 곱하기 역 모듈로 2 ^ p + 1을 갖지 않을 수 있습니다 . 따라서 2 가지 요소가 여전히 도입되고 있습니다.2+1

점근 적 복잡성을 불식시키지 않고 재귀 단계에서 사용할 링을 어떻게 선택합니까?

또는 의사 코드 형식으로 :

multiply_in_ring(a, b, n):
  ...
  // vvv                          vvv //
  // vvv HOW DOES THIS PART WORK? vvv //
  // vvv                          vvv //
  let inner_ring = convolution_ring_for_values_of_size(n);
  // ^^^                          ^^^ //
  // ^^^ HOW DOES THIS PART WORK? ^^^ //
  // ^^^                          ^^^ //

  let input_bits_per_piece = ceil(n / inner_ring.order);
  let piecesA = a.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);
  let piecesB = b.splitIntoNPiecesOfSize(inner_ring.order, input_bits_per_piece);

  let piecesC = inner_ring.negacyclic_convolution(piecesA, piecesB);
  ...

제발 여러 사이트에서 동일한 질문을 게시하지 않습니다 . 각 커뮤니티는 시간 낭비없이 정직하게 답변해야합니다. 두 사본 중 하나를 삭제하는 것이 좋습니다.
DW

@DW 완료. cs가 일주일 동안 답변을하지 않은 후에 교차 게시하여 해당 사이트에 너무 어려웠습니다. 대답을 분명히 다시 연결하려고했습니다.
Craig Gidney

이해 했어요. 나중에 올 경우 언제든지 운영자의 관심을 끌기 위해 게시물에 플래그를 지정하고 마이그레이션하도록 요청할 수 있으며 CSTheory로 이동할 수 있습니다. 이해해 주셔서 감사합니다!
DW

3
형식의 모듈로 숫자를 사용하는 알고리즘 버전이 있습니다 . A. Schönhage. 복잡한 계수를 갖는 다항식의 숫자 곱셈 및 나눗셈을위한 점근 적으로 빠른 알고리즘. EUROCAM '82 : 유럽 컴퓨터 대수 회의, Lect. 노트 Comp. 공상 과학 144, 3-15. iai.uni-bonn.de/~schoe/publi39.dvi2ν2
Markus Bläser

IIRC 당신은 지금 삭제 된 CS 질문에 부분적으로 자기 답을 얻었습니다. 그것을 잃는 것은 부끄러운 것 같습니다. 여기에 포함시킬 수 있습니까 (질문에 이미 답변 된 것으로 표시되지 않도록 질문에)?
피터 테일러

답변:


4

이 답변은 Markus가 주석에 링크 한 논문 "복잡한 계수를 갖는 다항식의 수치 적 축소 및 나눗셈을위한 빠른 속도의 알고리즘" 에서 발췌 한 것입니다.


비트 수, 모듈로 을 제곱하려고합니다 . 당신이하는 일은 다음과 같습니다.2+1

  • 및 를 만족하는 및 를 찾으십시오 .에스=(1)2에스에스2에스

  • 피스 수 을 선택하여 비트 를 분할 하고 피스 크기에 해당하는 매개 변수를 선택하십시오.2미디엄

    미디엄=에스/2+1에스2=에스/2+12=/2+1

    참고 하고 만족 계속 불변. 또한 이 만족되므로 입력이 운반 공간에 맞습니다.에스22에스222에스22미디엄2에스222+미디엄+1

  • 평소와 같이 조각과 나머지 부분에 대해 FFT 기반 음의 순환을 수행하십시오.

그래서 그것은 가장 중요한 아이디어입니다 : 대수 패딩 팩터 . 이제 복잡도 분석 FFT는 작업을 수행하고 크기 조각을 하므로 이제 재발 관계 wrt 사용하여 매우 거친 수학을 수행 할 수 있습니다 .미디엄2미디엄(21)2에스2에스

F(에스)()(1)2에스미디엄+2미디엄에프(에스/2+1)()2에스2에스(에스/2+1)+2에스/2+1에프(에스/2+1)()에스22에스+22에스/2에프(에스/2+1)()에스22에스+4(에스/2)22에스+16(에스/4)22에스+...()2에스에스2lg(에스)()lg(lglg)2lglglg()lg(lg2)lglg()(lg)lglg

나는 그 단계에서 많은 것을 속 였지만 옳은 것처럼 보입니다.

'트릭'우리가 결국 사실 것 같다 대신 기본 비용을. 나는이 문제에 대해 불평했지만, 지금의 반감과 같은 재귀 수준에 따라 두 가지로 두 개의 곱셈은, 거기에 여전히 모두가 밖으로 작동하므로 이중 배당을 지급한다. 그런 다음, 마지막에, 우리는의 추가 요소 취소 (실제의 요소 인 ) 만들기 덕분에 에 대수적으로 큰 상대 처음입니다.에스2에스에스에스로그에스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.