project euler exercise (#78)에 대해 연구하면서 번호 분할을 위해 멱급수를 만들 수 있음을 알게되었습니다. 이 시리즈에서 계수라는 용어를 확장하여 사용하면 특정 숫자를 분할하는 방법의 수를 얻을 수 있습니다. 거기에서파이썬 파티셔닝 기능 최적화가 필요합니다
, 나는이 작은 기능을 만들었습니다
## I've included two arguments, 'lim' for the number you wish to partition and 'ways' a list of numbers you can use to partition that number 'lim'. ##
def stack(lim,ways):
## create a list of length of 'lim' filled with 0's. ##
posi = [0] * (lim + 1)
## allow the posi[0] to be 1 ##
posi[0] = 1
## double loop -- with the amount of 'ways'. ##
for i in ways:
for k in range(i, lim + 1):
posi[k] += posi[k - i]
## return the 'lim' numbered from the list which will be the 'lim' coefficient. ##
return posi[lim]
>>> stack(100,[1,5,10,25,50,100])
>>> 293
>>> stack(100,range(1,100))
>>> 190569291
>>> stack(10000,range(1,10000))
>>> 36167251325636293988820471890953695495016030339315650422081868605887952568754066420592310556052906916435143L
이이 운동을하지로, 상대적으로 작은 파티션에서 잘 작동하지만. 재귀 또는 더 빠른 알고리즘을 사용하여이를 가속화 할 수있는 방법이 있습니까? 오각형의 숫자를 사용하는 것이 파티션을 돕는 방법이기도 한 곳을 읽었습니다. 그것이 1000000
업데이트로 나누어 경우
는 지금은이 문제에 실제 수를 반환하지만, 확인 할 필요가 없습니다 : 나는 pentagonal number theorem를 사용하여 끝났다. 나는 Craig Citro가 게시 한 Hardy-Ramanujan asymptotic 공식을 사용하려고 시도 할 것입니다.
해당 함수에 대한 입력 예제를 제공 할 수 있으며 출력 될 수 있습니까? 빠른 케이스와 '너무 긴 케이스'둘 다요? –
@JoshSmeaton 확실한 것. – tijko