문제 진술
고유하고 연속적인 소수 (2를 반드시 포함 할 필요는 없음)가 주어지면 이러한 소수의 1 차 거듭 제곱의 모든 조합의 곱을 생성합니다 (예 : 반복 없음). 또한 예를 들어 {2, 3, 5, 7}, {1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210}을 생성합니다.
1 = 1
2 = 2
3 = 3
5 = 5
6 = 2 x 3
7 = 7
10 = 2 x 5
14 = 2 x 7
15 = 3 x 5
21 = 3 x 7
30 = 2 x 3 x 5
35 = 5 x 7
42 = 2 x 3 x 7
70 = 2 x 5 x 7
105 = 3 x 5 x 7
210 = 2 x 3 x 5 x 7
입력 세트의 카디널리티가 k 인 경우 출력 세트에 2 ^ k 멤버가 제공됩니다.
규칙 / 조건
- 모든 언어를 사용할 수 있습니다. 가장 작은 문자 수의 소스 코드를 목표로합니다.
- 솔루션은 완전한 프로그램이거나 완전한 기능이어야합니다. 이 기능은 익명 일 수 있습니다 (언어가 익명 기능을 지원하는 경우).
- 솔루션은 최대 2 ^ 31까지 제품을 지원할 수 있어야합니다. 제품이 표현하기에 너무 큰 숫자를 전달받은 경우 정수 오버플로 감지 또는 처리에 대해 걱정하지 마십시오. 그러나 계산 한도를 명시하십시오.
- 목록 또는 세트를 승인하고 목록 또는 세트를 생성 할 수 있습니다. 입력이 정렬되었다고 가정 할 수 있지만 정렬 된 출력을 생성 할 필요는 없습니다.
배경
언제 또는 왜 이것이 유용한가요? 한 가지 유용한 점은 Square Forms Factorization 이라는 정수 인수 알고리즘에서 병렬로 곱하기 위해 승수 테이블을 생성하는 것입니다.. 거기에서 시도하는 홀수 승수는 하드 세미 프라임에서 알고리즘 실패 확률 (인수 찾기)을 약 50 % 줄입니다. 따라서 병렬로 경주 할 16 개의 시험 승수 세트를 생성하는 소수 ({3, 5, 7, 11})를 생성하면 알고리즘은 하드 세미 프라임에서 약 2 ^ -16의 시간에 실패합니다. 소수 목록에 13을 추가하면 32 개의 시험 곱셈기가 생성되어 실패 확률을 약 2 ^ -32로 줄이며 추가 계산 비용없이 결과를 획기적으로 개선합니다 (2 배의 곱셈기가 동시에 경주하기 때문에 평균은 여전히 동일한 총 단계 수에서 답을 찾습니다).