짐승 같은 힘으로는 계산할 수없는 큰 세트는 아닙니다. 모든 가능성을 검사 할 필요는 없으며 단지 '증가하는'자릿수의 암호 만 확인하십시오. 숫자 d
은 d-1
숫자가 j<i
인 경우 i
위치에 올 수없는 비밀번호를 의미합니다. 길이 당 유효 자릿수 증가 암호 :
- 1 : 0,
- 2 : 01
- 3 : 010, 012,
- 4 : 0101, 0102, 0120, 0121, 0123.하나 증가 자리 암호 가입일
는 n
가능한 자리수이고, nPk
다른 암호를 생성 할 수 있고, k
는 자리의 비밀번호를 증가 시키는데 사용 자릿수이다.
다음은이 접근 방식의 파이썬 구현입니다.
import math
import time
_ps = {}
def _P(n, k):
if (n, k) not in _ps:
_ps[(n, k)] = math.factorial(n) // math.factorial(n-k)
return _ps[(n, k)]
def _cc(length, last_digit, largest_digit, digits_left, counts, max_digit, max_length):
counts[length] += _P(max_digit+1, largest_digit+1)
if length < max_length:
for d in xrange(largest_digit+1): # Check digits 0-largest_digit
if d != last_digit and digits_left[d] > 0:
digits_left[d] -= 1
_cc(length+1, d, largest_digit, digits_left, counts, max_digit, max_length)
digits_left[d] += 1
if largest_digit < max_digit:
largest_digit += 1
digits_left[largest_digit] -= 1
_cc(length+1, largest_digit, largest_digit, digits_left, counts, max_digit, max_length)
digits_left[largest_digit] += 1
def count_combs(max_digit, max_length, min_length=4):
time1 = time.time()
digits_left = [1] + [2] * max_digit # Max 2 same digits to use
counts = [0] * (max_length + 1)
_cc(1, 0, 0, digits_left, counts, max_digit, max_length)
s = 0
for d, count in enumerate(counts[min_length:]):
print d+min_length, count
s += count
print 'Sum', s
print 'Time: %0.3f ms' % ((time.time()-time1)*1000.0,)
if __name__ == '__main__':
import sys
count_combs(int(sys.argv[1]), int(sys.argv[2]))
가장 큰 경우 내 노트북에서 ~ 11 분 실행됩니다. C 구현은 훨씬 빨라졌습니다. 사용법은 다음과 같습니다 가장 큰 사건의
python <script> <max_digit> <max_password_length>
python <script> 6 20
python <script> 9 20 # The largest example
결과는 다음과 같습니다
4 7290
5 64800
6 563040
7 4742640
8 38435040
9 297410400
10 2179668960
11 14994201600
12 95817708000
13 561778761600
14 2975712163200
15 13959599875200
16 56450035555200
17 189212904115200
18 494001259315200
19 896042510496000
20 851371260364800
Sum 2504688393448170
Time: 648185.829 ms
얼마나 많은 숫자? –
@WeatherVane은 사용자가 명령 줄 인수 – trungnt
@EugeneSh를 통해 사용자가 결정합니다. 아마 당신이 너무 많은 가능성이있을 수 있음을 암시 한 이래로 그 아이디어는별로 좋지 않다는 것을 깨달았을 것입니다. 그러나 그것이 내가 도움을 요청하는 이유입니다. – trungnt