숫자에 대해 가능한 모든 제수 곱을 생성하려면 어떻게해야합니까?

행성

나는 나에게 가능한 제품을 제공하는 알고리즘을 구현하기 위해 고군분투하고 있습니다. 예를 들면 N=24다음과 같습니다.

24*1, 12*2, 8*3, 6*4, 4*3*2, 3*2*2*2

주어진 숫자에 대한 소인수를 계산하는 함수를 구현했습니다 (예 : 2^33^1for N=24). 그러나 소인수에서 제수 조합을 얻는 방법을 알 수 없습니다.

편집 : 내가 시도한 내용은 다음과 같습니다.

def divisors(factors): # prime factors, e.g. [2,2,2,3] for 24
    yield list(factors)

    d = factors.pop()

    for i in range(len(factors)):
        m = [d*factors[i]] + factors[:i] + factors[i+1:]
        yield from divisors(m)
마크 디킨슨

작업하는 데 필요한 크기 숫자 또는 속도가 문제인지 여부는 언급하지 않지만 여기에 작은 입력 (예 : n보다 작음)에 대해 잘 작동해야하는 매우 간단한 최적화되지 않은 솔루션이 10**7있습니다.

def products(n, min_divisor=2):
    """Generate expressions of n as a product of ints >= min_divisor."""
    if n == 1:
        yield []
    for divisor in range(min_divisor, n+1):
        if n % divisor == 0:
            for product in products(n // divisor, divisor):
                yield product + [divisor]

코드를 설명하려면이 작업을 수작업으로 체계적으로 수행하는 방법을 생각해보십시오. 포함 된 제품으로 시작할 수 있습니다 2. 경우 n홀수, 어떤이 없습니다. 경우 n도있다, 우리는 간단한 재귀를 수행 할 수의 모든 가능한 분해를 발견 n // 2하고 출력 decomposition * 2각각에 대해. 우리가 포함 된 모든 제품을 소진 한 후에 2, 우리는 관련된 제품에 대한 이동합니다 3. 그러나 여기에 추가적인 합병증이 있습니다. 첫 번째 단계에서 이미 a가 포함 된 모든 제품을 찾았 2으므로 반복적 인 솔루션을 피하기 위해 모든 제수가 최소 3. 따라서 재귀 호출은 min_divisor의 최소 ​​허용 제수를 추적해야합니다 . 마지막으로 기본 케이스가 필요합니다.1 빈 제품으로 표현할 수 있습니다.

놓친 경우를 n=24포함하여에 대한 출력은 다음 6*2*2같습니다.

>>> for product in products(24):
...     print('*'.join(map(str, product)))
... 
3*2*2*2
6*2*2
4*3*2
12*2
8*3
6*4
24

그러나 이것은 만족스럽지 않습니다. 다른 주석가들이 지적했듯이, n소인수 분해 의 곱셈 분할을 계산할 수 있어야하며 필요한 경우에만 소수를 사용하여 소인수 분해의 지수 목록에서도 계산할 수 있어야 합니다. 요인을 재구성합니다. 다음은 기존의 소인수 분해와 함께 작동하는 위의 변형입니다. 효율성 향상을위한 여지가 여전히 많이 있습니다. 특히 itertools.product사전 식적으로 작은 모든 것을 무시하기 위한 호출 및 후속 필터링 에서 시작min_exponents 하는 사용자 지정 반복기로 교체해야합니다 . 그러나 이것은 출발점이되어야합니다.min_exponents

import itertools

def exponent_partitions(exponents, min_exponents):
    """Generate all vector partitions of 'exponents', each of whose
    entries is lexicographically at least 'min_exponents'."""
    if all(exponent == 0 for exponent in exponents):
        yield []
    else:
        for vector in itertools.product(*(range(v+1) for v in exponents)):
            if vector >= min_exponents:
                remainder = tuple(x - y for x, y in zip(exponents, vector))
                for partition in exponent_partitions(remainder, vector):
                    yield partition + [vector]


def divisor_from_exponents(primes, exponent_vector):
    """Reconstruct divisor from the list of exponents."""
    divisor = 1
    for p, e in zip(primes, exponent_vector):
        divisor *= p**e
    return divisor


def multiplicative_partitions(primes, exponents):
    """Generate all multiplication partitions of
    product(p**e for p, e in zip(primes, exponents))"""
    if len(exponents) == 0:
        # Corner case for partitions of 1.
        yield []
    else:
        initial_vector = (0,) * (len(exponents) - 1) + (1,)
        for partition in exponent_partitions(exponents, initial_vector):
            yield [divisor_from_exponents(primes, vector) for vector in partition]

그리고의 출력 24을 다시 : 우린 쓰기 24등은 2**3 * 3**1, 그래서 소수의 튜플이다 (2, 3)와 지수의 해당 튜플이다 (3, 1).

>>> for product in multiplicative_partitions((2, 3), (3, 1)):
...     print('*'.join(map(str, product)))
... 
2*2*2*3
4*2*3
8*3
6*2*2
12*2
4*6
24

정수의 곱셈 분할을 생성하고 계산하는 방법에 대한 많은 문헌이 있습니다. 예를 들어 OEIS A001055 의 링크 벡터 파티션 계산을위한 SAGE 함수참조하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

JavaScript에서 단어에서 가능한 모든 문자 대체 조합을 생성하려면 어떻게해야합니까?

분류에서Dev

khanacademy API에서 주제 (예 : 수학) 및 모든 하위 주제에 대한 모든 연습을 가져 오려면 어떻게해야합니까?

분류에서Dev

하나의 변수에 대한 상자 그림을 생성하려면 어떻게해야합니까?

분류에서Dev

모든 동적 셀에 대해 동일한 UIImage를 표시 할 수있는 신속한 배열을 작성하려면 어떻게해야합니까?

분류에서Dev

수많은 버튼 활성화 기능을 모든 숫자를 처리하는 하나의 기능으로 만들려면 어떻게해야합니까?

분류에서Dev

배열에서 숫자가 아닌 모든 요소를 제거하려면 어떻게해야합니까?

분류에서Dev

SurveyMonkey에 대한 제한된 액세스 API 토큰을 생성하려면 어떻게해야합니까?

분류에서Dev

8 진수 표기법을 사용하여 경로에 대한 모든 사용자에게 권한을 부여하려면 어떻게해야합니까?

분류에서Dev

특정 패키지에 대한 모든 빌드 종속성을 제거하려면 어떻게해야합니까?

분류에서Dev

특정 패키지에 대한 모든 빌드 종속성을 제거하려면 어떻게해야합니까?

분류에서Dev

테이블의 모든 행을 동일한 테이블에 복제하려면 어떻게해야합니까?

분류에서Dev

모든 직원 역할에 대해이 작업을 수행하려면 어떻게해야합니까?

분류에서Dev

R 스크립트에서 모든 매개 변수에 대한 변수를 사용하여 시퀀스를 생성하려면 어떻게해야합니까?

분류에서Dev

특정 문자열에 대한 모든 Git 보관함을 검색하려면 어떻게해야합니까?

분류에서Dev

기본 2의 모든 거듭 제곱이 합계가 아닌 표시되도록 방법을 수정하려면 어떻게해야합니까?

분류에서Dev

Scala에서 누가 항목을 제곱했는지 표를 사용하여 목록을 생성하려면 어떻게해야합니까?

분류에서Dev

모든 변수를 서로 교차시키고 R에서 카이 제곱 테스트 값을 수집하려면 어떻게해야합니까?

분류에서Dev

wicket의 모달 창에서 드래그 가능한 속성을 제거하려면 어떻게해야합니까?

분류에서Dev

사용자 정의 컨트롤의 모든 속성을 제거하려면 어떻게해야합니까?

분류에서Dev

numpy csr 행렬 "평균"함수가 모든 행렬에서 의미합니까? 특정 값을 제거하려면 어떻게해야합니까?

분류에서Dev

두 목록 집합에서 임의의 항목을 선택한 다음 모든 가능성으로 구성된 다른 목록에서 해당 항목 집합을 제거하려면 어떻게해야합니까?

분류에서Dev

외부 HDD의 "모든 사용자"에 대해 명령 줄을 통해 권한을 추가하려면 어떻게해야합니까?

분류에서Dev

요인의 모든 수준을 가진 주제별로 필터링하려면 어떻게해야합니까?

분류에서Dev

'cmake -D'로 정의 된 모든 변수를 한 번에 제거하려면 어떻게해야합니까?

분류에서Dev

사전에있는 숫자 목록을 제곱하려면 어떻게해야합니까?

분류에서Dev

AMD 모듈을 사용하여 TypeScript에서 생성 한 코드를 실제로 실행하려면 어떻게해야합니까?

분류에서Dev

compizconfig에서 실수로 모든 것을 비활성화 한 후 데스크톱을 수정하려면 어떻게해야합니까?

분류에서Dev

모든 연락처 (또는 단일 연락처)에 대한 Skype 미리보기 채팅 기록을 삭제하려면 어떻게해야합니까?

분류에서Dev

정확한 숫자에 도달했을 때 생성기가 숫자를 생성하지 못하도록하려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    JavaScript에서 단어에서 가능한 모든 문자 대체 조합을 생성하려면 어떻게해야합니까?

  2. 2

    khanacademy API에서 주제 (예 : 수학) 및 모든 하위 주제에 대한 모든 연습을 가져 오려면 어떻게해야합니까?

  3. 3

    하나의 변수에 대한 상자 그림을 생성하려면 어떻게해야합니까?

  4. 4

    모든 동적 셀에 대해 동일한 UIImage를 표시 할 수있는 신속한 배열을 작성하려면 어떻게해야합니까?

  5. 5

    수많은 버튼 활성화 기능을 모든 숫자를 처리하는 하나의 기능으로 만들려면 어떻게해야합니까?

  6. 6

    배열에서 숫자가 아닌 모든 요소를 제거하려면 어떻게해야합니까?

  7. 7

    SurveyMonkey에 대한 제한된 액세스 API 토큰을 생성하려면 어떻게해야합니까?

  8. 8

    8 진수 표기법을 사용하여 경로에 대한 모든 사용자에게 권한을 부여하려면 어떻게해야합니까?

  9. 9

    특정 패키지에 대한 모든 빌드 종속성을 제거하려면 어떻게해야합니까?

  10. 10

    특정 패키지에 대한 모든 빌드 종속성을 제거하려면 어떻게해야합니까?

  11. 11

    테이블의 모든 행을 동일한 테이블에 복제하려면 어떻게해야합니까?

  12. 12

    모든 직원 역할에 대해이 작업을 수행하려면 어떻게해야합니까?

  13. 13

    R 스크립트에서 모든 매개 변수에 대한 변수를 사용하여 시퀀스를 생성하려면 어떻게해야합니까?

  14. 14

    특정 문자열에 대한 모든 Git 보관함을 검색하려면 어떻게해야합니까?

  15. 15

    기본 2의 모든 거듭 제곱이 합계가 아닌 표시되도록 방법을 수정하려면 어떻게해야합니까?

  16. 16

    Scala에서 누가 항목을 제곱했는지 표를 사용하여 목록을 생성하려면 어떻게해야합니까?

  17. 17

    모든 변수를 서로 교차시키고 R에서 카이 제곱 테스트 값을 수집하려면 어떻게해야합니까?

  18. 18

    wicket의 모달 창에서 드래그 가능한 속성을 제거하려면 어떻게해야합니까?

  19. 19

    사용자 정의 컨트롤의 모든 속성을 제거하려면 어떻게해야합니까?

  20. 20

    numpy csr 행렬 "평균"함수가 모든 행렬에서 의미합니까? 특정 값을 제거하려면 어떻게해야합니까?

  21. 21

    두 목록 집합에서 임의의 항목을 선택한 다음 모든 가능성으로 구성된 다른 목록에서 해당 항목 집합을 제거하려면 어떻게해야합니까?

  22. 22

    외부 HDD의 "모든 사용자"에 대해 명령 줄을 통해 권한을 추가하려면 어떻게해야합니까?

  23. 23

    요인의 모든 수준을 가진 주제별로 필터링하려면 어떻게해야합니까?

  24. 24

    'cmake -D'로 정의 된 모든 변수를 한 번에 제거하려면 어떻게해야합니까?

  25. 25

    사전에있는 숫자 목록을 제곱하려면 어떻게해야합니까?

  26. 26

    AMD 모듈을 사용하여 TypeScript에서 생성 한 코드를 실제로 실행하려면 어떻게해야합니까?

  27. 27

    compizconfig에서 실수로 모든 것을 비활성화 한 후 데스크톱을 수정하려면 어떻게해야합니까?

  28. 28

    모든 연락처 (또는 단일 연락처)에 대한 Skype 미리보기 채팅 기록을 삭제하려면 어떻게해야합니까?

  29. 29

    정확한 숫자에 도달했을 때 생성기가 숫자를 생성하지 못하도록하려면 어떻게해야합니까?

뜨겁다태그

보관