The tables below show just how password policies that require either at least N character classes or at least N characters of each class affect the total keyspace for each length.
Once in a while, someone posts to john-users asking how to restrict John the Ripper to match a policy, hoping that this would substantially reduce the number of candidate passwords to try. Most of the time, such assumptions are incorrect, although in some extreme cases they are valid.
For example, for printable US-ASCII (95 different characters) and length 8 requiring at least 3 character classes (out of four: digits, lowercase letters, uppercase letters, and other characters) reduces the keyspace by only 5.5% (so it is a reasonable thing to do). However, requiring at least 2 characters of each class (which for length 8 implies exactly 2 characters of each class) reduces the keyspace for length 8 by a factor of 52.9 (which is almost as bad as making passwords one character shorter) and for length 9 by a factor of 17.6.
In practice, passwdqc combines the “at least N classes” approach with other requirements, which disallows common password patterns while not reducing the keyspace too much. More trivial approaches are just not good enough: simply requiring e.g. at least 3 classes allows for passwords of the form “Password1” (a common pattern, even when not word-based), and requiring at least 2 characters of a class often reduces the keyspace too much. Also, passwdqc supports longer passphrases, where it can require as few as 2 different character classes (such as letters and word separators).
To have John the Ripper match a trivial policy, revisions of the [List.External:Policy]
external mode sample may be used (providing a filter for use with other cracking modes), which may or may not be beneficial (because generating and filtering out some candidate passwords involves overhead, and also because assumptions about passwords actually following a policy are often wrong).
Length | Min classes | Password count | % of total |
6 | 1 | 735091890625 | 100.00% |
6 | 2 | 733181591104 | 99.74% |
6 | 3 | 624105885000 | 84.90% |
6 | 4 | 198202118400 | 26.96% |
7 | 1 | 69833729609375 | 100.00% |
7 | 2 | 69775037546046 | 99.92% |
7 | 3 | 63517192124568 | 90.95% |
7 | 4 | 25736929218000 | 36.85% |
8 | 1 | 6634204312890625 | 100.00% |
8 | 2 | 6632380150143232 | 99.97% |
8 | 3 | 6273401614552800 | 94.56% |
8 | 4 | 3025989069143040 | 45.61% |
9 | 1 | 630249409724609375 | 100.00% |
9 | 2 | 630192138232849470 | 99.99% |
9 | 3 | 609552342661909920 | 96.72% |
9 | 4 | 334945539778449600 | 53.14% |
10 | 1 | 59873693923837890625 | 100.00% |
10 | 2 | 59871880000661319424 | 100.00% |
10 | 3 | 58681609358447283000 | 98.01% |
10 | 4 | 35648464491154944000 | 59.54% |
11 | 1 | 5688000922764599609375 | 100.00% |
11 | 2 | 5687943039869111907006 | 100.00% |
11 | 3 | 5619095509009592606568 | 98.79% |
11 | 4 | 3693920441464757790000 | 64.94% |
12 | 1 | 540360087662636962890625 | 100.00% |
12 | 2 | 540358228914208686541312 | 100.00% |
12 | 3 | 536365096923054294152400 | 99.26% |
12 | 4 | 375596253406523266191360 | 69.51% |
13 | 1 | 51334208327950511474609375 | 100.00% |
13 | 2 | 51334148325280771618632510 | 100.00% |
13 | 3 | 51101998006019799868738800 | 99.55% |
13 | 4 | 37668707227364394045664800 | 73.38% |
14 | 1 | 4876749791155298590087890625 | 100.00% |
14 | 2 | 4876747845803567399692966144 | 100.00% |
14 | 3 | 4863223810765665455446463400 | 99.72% |
14 | 4 | 3739282898628476268150681600 | 76.68% |
15 | 1 | 463291230159753366058349609375 | 100.00% |
15 | 2 | 463291166866288182621477215166 | 100.00% |
15 | 3 | 462501957521229240862873357368 | 99.83% |
15 | 4 | 368305588892338901765251290000 | 79.50% |
16 | 1 | 44012666865176569775543212890625 | 100.00% |
16 | 2 | 44012664799973872514126586836992 | 100.00% |
16 | 3 | 43966542166845205317987336676800 | 99.90% |
16 | 4 | 36058035064266385286663961722880 | 81.93% |
Length | Min digits/lowers/uppers/others | Password count | % of total |
6 | 0/0/0/0 | 735091890625 | 100.00% |
6 | 0/0/0/1 | 678291655041 | 92.27% |
6 | 0/0/0/2 | 496897354305 | 67.60% |
6 | 0/0/1/0 | 627173727544 | 85.32% |
6 | 0/0/1/1 | 572550274296 | 77.89% |
6 | 0/0/1/2 | 403128276408 | 54.84% |
6 | 0/0/2/0 | 383184837100 | 52.13% |
6 | 0/0/2/1 | 337994107308 | 45.98% |
6 | 0/0/2/2 | 211805425260 | 28.81% |
6 | 0/1/0/0 | 627173727544 | 85.32% |
6 | 0/1/0/1 | 572550274296 | 77.89% |
6 | 0/1/0/2 | 403128276408 | 54.84% |
6 | 0/1/1/0 | 525576927512 | 71.50% |
6 | 0/1/1/1 | 473129256600 | 64.36% |
6 | 0/1/1/2 | 315659761560 | 42.94% |
6 | 0/1/2/0 | 304521354176 | 41.43% |
6 | 0/1/2/1 | 261490806720 | 35.57% |
6 | 0/1/2/2 | 146997227520 | 20.00% |
6 | 0/2/0/0 | 383184837100 | 52.13% |
6 | 0/2/0/1 | 337994107308 | 45.98% |
6 | 0/2/0/2 | 211805425260 | 28.81% |
6 | 0/2/1/0 | 304521354176 | 41.43% |
6 | 0/2/1/1 | 261490806720 | 35.57% |
6 | 0/2/1/2 | 146997227520 | 20.00% |
6 | 0/2/2/0 | 152799065120 | 20.79% |
6 | 0/2/2/1 | 118982841120 | 16.19% |
6 | 0/2/2/2 | 44788217760 | 6.09% |
6 | 1/0/0/0 | 357942375000 | 48.69% |
6 | 1/0/0/1 | 320912749080 | 43.66% |
6 | 1/0/0/2 | 214798846680 | 29.22% |
6 | 1/0/1/0 | 292204745560 | 39.75% |
6 | 1/0/1/1 | 257042986200 | 34.97% |
6 | 1/0/1/2 | 160548874200 | 21.84% |
6 | 1/0/2/0 | 159744045760 | 21.73% |
6 | 1/0/2/1 | 132161515200 | 17.98% |
6 | 1/0/2/2 | 67138156800 | 9.13% |
6 | 1/1/0/0 | 292204745560 | 39.75% |
6 | 1/1/0/1 | 257042986200 | 34.97% |
6 | 1/1/0/2 | 160548874200 | 21.84% |
6 | 1/1/1/0 | 231497011200 | 31.49% |
6 | 1/1/1/1 | 198202118400 | 26.96% |
6 | 1/1/1/2 | 111307996800 | 15.14% |
6 | 1/1/2/0 | 115864507200 | 15.76% |
6 | 1/1/2/1 | 90133243200 | 12.26% |
6 | 1/1/2/2 | 34452475200 | 4.69% |
6 | 1/2/0/0 | 159744045760 | 21.73% |
6 | 1/2/0/1 | 132161515200 | 17.98% |
6 | 1/2/0/2 | 67138156800 | 9.13% |
6 | 1/2/1/0 | 115864507200 | 15.76% |
6 | 1/2/1/1 | 90133243200 | 12.26% |
6 | 1/2/1/2 | 34452475200 | 4.69% |
6 | 1/2/2/0 | 45514809600 | 6.19% |
6 | 1/2/2/1 | 27144374400 | 3.69% |
6 | 1/2/2/2 | 0 | 0.00% |
6 | 2/0/0/0 | 91719187500 | 12.48% |
6 | 2/0/0/1 | 77501803500 | 10.54% |
6 | 2/0/0/2 | 43772899500 | 5.95% |
6 | 2/0/1/0 | 68877016000 | 9.37% |
6 | 2/0/1/1 | 55814616000 | 7.59% |
6 | 2/0/1/2 | 27181440000 | 3.70% |
6 | 2/0/2/0 | 30931732000 | 4.21% |
6 | 2/0/2/1 | 21884148000 | 2.98% |
6 | 2/0/2/2 | 6625476000 | 0.90% |
6 | 2/1/0/0 | 68877016000 | 9.37% |
6 | 2/1/0/1 | 55814616000 | 7.59% |
6 | 2/1/0/2 | 27181440000 | 3.70% |
6 | 2/1/1/0 | 48716616000 | 6.63% |
6 | 2/1/1/1 | 36808200000 | 5.01% |
6 | 2/1/1/2 | 13250952000 | 1.80% |
6 | 2/1/2/0 | 18349344000 | 2.50% |
6 | 2/1/2/1 | 10440144000 | 1.42% |
6 | 2/1/2/2 | 0 | 0.00% |
6 | 2/2/0/0 | 30931732000 | 4.21% |
6 | 2/2/0/1 | 21884148000 | 2.98% |
6 | 2/2/0/2 | 6625476000 | 0.90% |
6 | 2/2/1/0 | 18349344000 | 2.50% |
6 | 2/2/1/1 | 10440144000 | 1.42% |
6 | 2/2/1/2 | 0 | 0.00% |
6 | 2/2/2/0 | 4112784000 | 0.56% |
6 | 2/2/2/1 | 0 | 0.00% |
6 | 2/2/2/2 | 0 | 0.00% |
7 | 0/0/0/0 | 69833729609375 | 100.00% |
7 | 0/0/0/1 | 66312115003167 | 94.96% |
7 | 0/0/0/2 | 53191260583263 | 76.17% |
7 | 0/0/1/0 | 62387376356786 | 89.34% |
7 | 0/0/1/1 | 58944125914674 | 84.41% |
7 | 0/0/1/2 | 46326108214386 | 66.34% |
7 | 0/0/2/0 | 42746270676044 | 61.21% |
7 | 0/0/2/1 | 39699194619084 | 56.85% |
7 | 0/0/2/2 | 29260136037132 | 41.90% |
7 | 0/1/0/0 | 62387376356786 | 89.34% |
7 | 0/1/0/1 | 58944125914674 | 84.41% |
7 | 0/1/0/2 | 46326108214386 | 66.34% |
7 | 0/1/1/0 | 55212841715304 | 79.06% |
7 | 0/1/1/1 | 51847945437288 | 74.24% |
7 | 0/1/1/2 | 39732533456616 | 56.90% |
7 | 0/1/2/0 | 36722224109480 | 52.59% |
7 | 0/1/2/1 | 33753320216616 | 48.33% |
7 | 0/1/2/2 | 23813263754280 | 34.10% |
7 | 0/2/0/0 | 42746270676044 | 61.21% |
7 | 0/2/0/1 | 39699194619084 | 56.85% |
7 | 0/2/0/2 | 29260136037132 | 41.90% |
7 | 0/2/1/0 | 36722224109480 | 52.59% |
7 | 0/2/1/1 | 33753320216616 | 48.33% |
7 | 0/2/1/2 | 23813263754280 | 34.10% |
7 | 0/2/2/0 | 22405470217312 | 32.08% |
7 | 0/2/2/1 | 19829719509600 | 28.40% |
7 | 0/2/2/2 | 12018171765600 | 17.21% |
7 | 1/0/0/0 | 37776020781250 | 54.09% |
7 | 1/0/0/1 | 35282477877570 | 50.52% |
7 | 1/0/0/2 | 26728634290050 | 38.27% |
7 | 1/0/1/0 | 32818319013480 | 46.99% |
7 | 1/0/1/1 | 30395108463720 | 43.52% |
7 | 1/0/1/2 | 22272742051560 | 31.89% |
7 | 1/0/2/0 | 20854070455400 | 29.86% |
7 | 1/0/2/1 | 18770811619560 | 26.88% |
7 | 1/0/2/2 | 12399247060200 | 17.76% |
7 | 1/1/0/0 | 32818319013480 | 46.99% |
7 | 1/1/0/1 | 30395108463720 | 43.52% |
7 | 1/1/0/2 | 22272742051560 | 31.89% |
7 | 1/1/1/0 | 28089817413840 | 40.22% |
7 | 1/1/1/1 | 25736929218000 | 36.85% |
7 | 1/1/1/2 | 18045808981200 | 25.84% |
7 | 1/1/2/0 | 17041009760320 | 24.40% |
7 | 1/1/2/1 | 15027891278400 | 21.52% |
7 | 1/1/2/2 | 9083969294400 | 13.01% |
7 | 1/2/0/0 | 20854070455400 | 29.86% |
7 | 1/2/0/1 | 18770811619560 | 26.88% |
7 | 1/2/0/2 | 12399247060200 | 17.76% |
7 | 1/2/1/0 | 17041009760320 | 24.40% |
7 | 1/2/1/1 | 15027891278400 | 21.52% |
7 | 1/2/1/2 | 9083969294400 | 13.01% |
7 | 1/2/2/0 | 9054933742400 | 12.97% |
7 | 1/2/2/1 | 7378745774400 | 10.57% |
7 | 1/2/2/2 | 3135175243200 | 4.49% |
7 | 2/0/0/0 | 11375554687500 | 16.29% |
7 | 2/0/0/1 | 10265954460300 | 14.70% |
7 | 2/0/0/2 | 6981738756300 | 10.00% |
7 | 2/0/1/0 | 9370490274600 | 13.42% |
7 | 2/0/1/1 | 8309598297000 | 11.90% |
7 | 2/0/1/2 | 5292183897000 | 7.58% |
7 | 2/0/2/0 | 5213215061600 | 7.47% |
7 | 2/0/2/1 | 4362530172000 | 6.25% |
7 | 2/0/2/2 | 2272538268000 | 3.25% |
7 | 2/1/0/0 | 9370490274600 | 13.42% |
7 | 2/1/0/1 | 8309598297000 | 11.90% |
7 | 2/1/0/2 | 5292183897000 | 7.58% |
7 | 2/1/1/0 | 7504223272000 | 10.75% |
7 | 2/1/1/1 | 6492029544000 | 9.30% |
7 | 2/1/1/2 | 3741185448000 | 5.36% |
7 | 2/1/2/0 | 3835030472000 | 5.49% |
7 | 2/1/2/1 | 3032861832000 | 4.34% |
7 | 2/1/2/2 | 1205836632000 | 1.73% |
7 | 2/2/0/0 | 5213215061600 | 7.47% |
7 | 2/2/0/1 | 4362530172000 | 6.25% |
7 | 2/2/0/2 | 2272538268000 | 3.25% |
7 | 2/2/1/0 | 3835030472000 | 5.49% |
7 | 2/2/1/1 | 3032861832000 | 4.34% |
7 | 2/2/1/2 | 1205836632000 | 1.73% |
7 | 2/2/2/0 | 1545035856000 | 2.21% |
7 | 2/2/2/1 | 950053104000 | 1.36% |
7 | 2/2/2/2 | 0 | 0.00% |
8 | 0/0/0/0 | 6634204312890625 | 100.00% |
8 | 0/0/0/1 | 6415864207305729 | 96.71% |
8 | 0/0/0/2 | 5486157951266817 | 82.70% |
8 | 0/0/1/0 | 6120405938461984 | 92.26% |
8 | 0/0/1/1 | 5904886942784544 | 89.01% |
8 | 0/0/1/2 | 4995868826066976 | 75.30% |
8 | 0/0/2/0 | 4571564461923472 | 68.91% |
8 | 0/0/2/1 | 4372345212378000 | 65.91% |
8 | 0/0/2/2 | 3567917133340560 | 53.78% |
8 | 0/1/0/0 | 6120405938461984 | 92.26% |
8 | 0/1/0/1 | 5904886942784544 | 89.01% |
8 | 0/1/0/2 | 4995868826066976 | 75.30% |
8 | 0/1/1/0 | 5618295764310944 | 84.69% |
8 | 0/1/1/1 | 5405597778540960 | 81.48% |
8 | 0/1/1/2 | 4517265161144736 | 68.09% |
8 | 0/1/2/0 | 4125992558882688 | 62.19% |
8 | 0/1/2/1 | 3929592239244672 | 59.23% |
8 | 0/1/2/2 | 3145801611528576 | 47.42% |
8 | 0/2/0/0 | 4571564461923472 | 68.91% |
8 | 0/2/0/1 | 4372345212378000 | 65.91% |
8 | 0/2/0/2 | 3567917133340560 | 53.78% |
8 | 0/2/1/0 | 4125992558882688 | 62.19% |
8 | 0/2/1/1 | 3929592239244672 | 59.23% |
8 | 0/2/1/2 | 3145801611528576 | 47.42% |
8 | 0/2/2/0 | 2872990873037376 | 43.31% |
8 | 0/2/2/1 | 2692850363531328 | 40.59% |
8 | 0/2/2/2 | 2012852176695360 | 30.34% |
8 | 1/0/0/0 | 3909299062500000 | 58.93% |
8 | 1/0/0/1 | 3744418685446560 | 56.44% |
8 | 1/0/0/2 | 3086123358875040 | 46.52% |
8 | 1/0/1/0 | 3542331125675680 | 53.39% |
8 | 1/0/1/1 | 3380063031465120 | 50.95% |
8 | 1/0/1/2 | 2740335446328480 | 41.31% |
8 | 1/0/2/0 | 2511129157979520 | 37.85% |
8 | 1/0/2/1 | 2363490193384320 | 35.63% |
8 | 1/0/2/2 | 1813509860722560 | 27.34% |
8 | 1/1/0/0 | 3542331125675680 | 53.39% |
8 | 1/1/0/1 | 3380063031465120 | 50.95% |
8 | 1/1/0/2 | 2740335446328480 | 41.31% |
8 | 1/1/1/0 | 3185644980510720 | 48.02% |
8 | 1/1/1/1 | 3025989069143040 | 45.61% |
8 | 1/1/1/2 | 2404826585441280 | 36.25% |
8 | 1/1/2/0 | 2202116647785600 | 33.19% |
8 | 1/1/2/1 | 2057087786033280 | 31.01% |
8 | 1/1/2/2 | 1525624506806400 | 23.00% |
8 | 1/2/0/0 | 2511129157979520 | 37.85% |
8 | 1/2/0/1 | 2363490193384320 | 35.63% |
8 | 1/2/0/2 | 1813509860722560 | 27.34% |
8 | 1/2/1/0 | 2202116647785600 | 33.19% |
8 | 1/2/1/1 | 2057087786033280 | 31.01% |
8 | 1/2/1/2 | 1525624506806400 | 23.00% |
8 | 1/2/2/0 | 1409000023208960 | 21.24% |
8 | 1/2/2/1 | 1278560355072000 | 19.27% |
8 | 1/2/2/2 | 836046731520000 | 12.60% |
8 | 2/0/0/0 | 1344682356250000 | 20.27% |
8 | 2/0/0/1 | 1262047715398800 | 19.02% |
8 | 2/0/0/2 | 969113255418000 | 14.61% |
8 | 2/0/1/0 | 1176806538211200 | 17.74% |
8 | 2/0/1/1 | 1096141635388800 | 16.52% |
8 | 2/0/1/2 | 816066153302400 | 12.30% |
8 | 2/0/2/0 | 759753140328000 | 11.45% |
8 | 2/0/2/1 | 689219553422400 | 10.39% |
8 | 2/0/2/2 | 464638742568000 | 7.00% |
8 | 2/1/0/0 | 1176806538211200 | 17.74% |
8 | 2/1/0/1 | 1096141635388800 | 16.52% |
8 | 2/1/0/2 | 816066153302400 | 12.30% |
8 | 2/1/1/0 | 1015803036393600 | 15.31% |
8 | 2/1/1/1 | 937107771600000 | 14.13% |
8 | 2/1/1/2 | 669888627408000 | 10.10% |
8 | 2/1/2/0 | 627619499852800 | 9.46% |
8 | 2/1/2/1 | 559053470976000 | 8.43% |
8 | 2/1/2/2 | 347280950016000 | 5.23% |
8 | 2/2/0/0 | 759753140328000 | 11.45% |
8 | 2/2/0/1 | 689219553422400 | 10.39% |
8 | 2/2/0/2 | 464638742568000 | 7.00% |
8 | 2/2/1/0 | 627619499852800 | 9.46% |
8 | 2/2/1/1 | 559053470976000 | 8.43% |
8 | 2/2/1/2 | 347280950016000 | 5.23% |
8 | 2/2/2/0 | 340957105216000 | 5.14% |
8 | 2/2/2/1 | 282482456256000 | 4.26% |
8 | 2/2/2/2 | 125407009728000 | 1.89% |
9 | 0/0/0/0 | 630249409724609375 | 100.00% |
9 | 0/0/0/1 | 616712323178345823 | 97.85% |
9 | 0/0/0/2 | 551865311819631711 | 87.56% |
9 | 0/0/1/0 | 594797321889033146 | 94.37% |
9 | 0/0/1/1 | 581361795299438010 | 92.24% |
9 | 0/0/1/2 | 517352653583238330 | 82.09% |
9 | 0/0/2/0 | 474568502272731152 | 75.30% |
9 | 0/0/2/1 | 461793115401480720 | 73.27% |
9 | 0/0/2/2 | 402624998286475536 | 63.88% |
9 | 0/1/0/0 | 594797321889033146 | 94.37% |
9 | 0/1/0/1 | 581361795299438010 | 92.24% |
9 | 0/1/0/2 | 517352653583238330 | 82.09% |
9 | 0/1/1/0 | 559847826665393760 | 88.83% |
9 | 0/1/1/1 | 546513859032467040 | 86.71% |
9 | 0/1/1/2 | 483342557258781792 | 76.69% |
9 | 0/1/2/0 | 442354045914050400 | 70.19% |
9 | 0/1/2/1 | 429680194599468384 | 68.18% |
9 | 0/1/2/2 | 371349299666977632 | 58.92% |
9 | 0/2/0/0 | 474568502272731152 | 75.30% |
9 | 0/2/0/1 | 461793115401480720 | 73.27% |
9 | 0/2/0/2 | 402624998286475536 | 63.88% |
9 | 0/2/1/0 | 442354045914050400 | 70.19% |
9 | 0/2/1/1 | 429680194599468384 | 68.18% |
9 | 0/2/1/2 | 371349299666977632 | 58.92% |
9 | 0/2/2/0 | 338090220602506944 | 53.64% |
9 | 0/2/2/1 | 326075998886269632 | 51.74% |
9 | 0/2/2/2 | 272574267562973376 | 43.25% |
9 | 1/0/0/0 | 398632463441406250 | 63.25% |
9 | 1/0/0/1 | 387875282778778410 | 61.54% |
9 | 1/0/0/2 | 338905810793906730 | 53.77% |
9 | 1/0/1/0 | 371843371424484960 | 59.00% |
9 | 1/0/1/1 | 361182321214846560 | 57.31% |
9 | 1/0/1/2 | 312988697234310240 | 49.66% |
9 | 1/0/2/0 | 285972874207594080 | 45.37% |
9 | 1/0/2/1 | 275923098183189600 | 43.78% |
9 | 1/0/2/2 | 232074325698415200 | 36.82% |
9 | 1/1/0/0 | 371843371424484960 | 59.00% |
9 | 1/1/0/1 | 361182321214846560 | 57.31% |
9 | 1/1/0/2 | 312988697234310240 | 49.66% |
9 | 1/1/1/0 | 345510460535098560 | 54.82% |
9 | 1/1/1/1 | 334945539778449600 | 53.14% |
9 | 1/1/1/2 | 287527734102248640 | 45.62% |
9 | 1/1/2/0 | 262045902566497920 | 41.58% |
9 | 1/1/2/1 | 252092232595082880 | 40.00% |
9 | 1/1/2/2 | 209018660654643840 | 33.16% |
9 | 1/2/0/0 | 285972874207594080 | 45.37% |
9 | 1/2/0/1 | 275923098183189600 | 43.78% |
9 | 1/2/0/2 | 232074325698415200 | 36.82% |
9 | 1/2/1/0 | 262045902566497920 | 41.58% |
9 | 1/2/1/1 | 252092232595082880 | 40.00% |
9 | 1/2/1/2 | 209018660654643840 | 33.16% |
9 | 1/2/2/0 | 189736975181120640 | 30.11% |
9 | 1/2/2/1 | 180394069274939520 | 28.62% |
9 | 1/2/2/2 | 141653487838262400 | 22.48% |
9 | 2/0/0/0 | 153390990906250000 | 24.34% |
9 | 2/0/0/1 | 147445185811453200 | 23.39% |
9 | 2/0/0/2 | 122902697478646800 | 19.50% |
9 | 2/0/1/0 | 139816638273717600 | 22.18% |
9 | 2/0/1/1 | 133948169196098400 | 21.25% |
9 | 2/0/1/2 | 109990693057845600 | 17.45% |
9 | 2/0/2/0 | 100533696852638400 | 15.95% |
9 | 2/0/2/1 | 95126146473758400 | 15.09% |
9 | 2/0/2/2 | 74177671162795200 | 11.77% |
9 | 2/1/0/0 | 139816638273717600 | 22.18% |
9 | 2/1/0/1 | 133948169196098400 | 21.25% |
9 | 2/1/0/2 | 109990693057845600 | 17.45% |
9 | 2/1/1/0 | 126571889993078400 | 20.08% |
9 | 2/1/1/1 | 120780755932636800 | 19.16% |
9 | 2/1/1/2 | 97408262288937600 | 15.46% |
9 | 2/1/2/0 | 88897070567760000 | 14.11% |
9 | 2/1/2/1 | 83566831806057600 | 13.26% |
9 | 2/1/2/2 | 63202721229648000 | 10.03% |
9 | 2/2/0/0 | 100533696852638400 | 15.95% |
9 | 2/2/0/1 | 95126146473758400 | 15.09% |
9 | 2/2/0/2 | 74177671162795200 | 11.77% |
9 | 2/2/1/0 | 88897070567760000 | 14.11% |
9 | 2/2/1/1 | 83566831806057600 | 13.26% |
9 | 2/2/1/2 | 63202721229648000 | 10.03% |
9 | 2/2/2/0 | 57977798696563200 | 9.20% |
9 | 2/2/2/1 | 53107968513600000 | 8.43% |
9 | 2/2/2/2 | 35740997772480000 | 5.67% |
10 | 0/0/0/0 | 59873693923837890625 | 100.00% |
10 | 0/0/0/1 | 59034394557969550401 | 98.60% |
10 | 0/0/0/2 | 54567155997702578241 | 91.14% |
10 | 0/0/1/0 | 57427499863183130824 | 95.91% |
10 | 0/0/1/1 | 56591856655754853576 | 94.52% |
10 | 0/0/1/2 | 52158132881188458696 | 87.11% |
10 | 0/0/2/0 | 48209957025933311284 | 80.52% |
10 | 0/0/2/1 | 47400719407238822196 | 79.17% |
10 | 0/0/2/2 | 43184841739726179636 | 72.13% |
10 | 0/1/0/0 | 57427499863183130824 | 95.91% |
10 | 0/1/0/1 | 56591856655754853576 | 94.52% |
10 | 0/1/0/2 | 52158132881188458696 | 87.11% |
10 | 0/1/1/0 | 55002917284841655272 | 91.86% |
10 | 0/1/1/1 | 54170930225853441000 | 90.48% |
10 | 0/1/1/2 | 49770720906987623400 | 83.13% |
10 | 0/1/2/0 | 45916048526695414912 | 76.69% |
10 | 0/1/2/1 | 45110466796440988800 | 75.34% |
10 | 0/1/2/2 | 40928095862628923520 | 68.36% |
10 | 0/2/0/0 | 48209957025933311284 | 80.52% |
10 | 0/2/0/1 | 47400719407238822196 | 79.17% |
10 | 0/2/0/2 | 43184841739726179636 | 72.13% |
10 | 0/2/1/0 | 45916048526695414912 | 76.69% |
10 | 0/2/1/1 | 45110466796440988800 | 75.34% |
10 | 0/2/1/2 | 40928095862628923520 | 68.36% |
10 | 0/2/2/0 | 37540289873438419392 | 62.70% |
10 | 0/2/2/1 | 36761107387917781440 | 61.40% |
10 | 0/2/2/2 | 32796414221559468480 | 54.78% |
10 | 1/0/0/0 | 40186253489765625000 | 67.12% |
10 | 1/0/0/1 | 39491509229846341800 | 65.96% |
10 | 1/0/0/2 | 35941639611179154600 | 60.03% |
10 | 1/0/1/0 | 38251176182411506600 | 63.89% |
10 | 1/0/1/1 | 37559946913836633000 | 62.73% |
10 | 1/0/1/2 | 34041800344655961000 | 56.86% |
10 | 1/0/2/0 | 31286012258011971200 | 52.25% |
10 | 1/0/2/1 | 30619776907214352000 | 51.14% |
10 | 1/0/2/2 | 27303350819160873600 | 45.60% |
10 | 1/1/0/0 | 38251176182411506600 | 63.89% |
10 | 1/1/0/1 | 37559946913836633000 | 62.73% |
10 | 1/1/0/2 | 34041800344655961000 | 56.86% |
10 | 1/1/1/0 | 36336178778385408000 | 60.69% |
10 | 1/1/1/1 | 35648464491154944000 | 59.54% |
10 | 1/1/1/2 | 32162040641460787200 | 53.72% |
10 | 1/1/2/0 | 29489621947144944000 | 49.25% |
10 | 1/1/2/1 | 28826901317691734400 | 48.15% |
10 | 1/1/2/2 | 25542190227124771200 | 42.66% |
10 | 1/2/0/0 | 31286012258011971200 | 52.25% |
10 | 1/2/0/1 | 30619776907214352000 | 51.14% |
10 | 1/2/0/2 | 27303350819160873600 | 45.60% |
10 | 1/2/1/0 | 29489621947144944000 | 49.25% |
10 | 1/2/1/1 | 28826901317691734400 | 48.15% |
10 | 1/2/1/2 | 25542190227124771200 | 42.66% |
10 | 1/2/2/0 | 23268609320459942400 | 38.86% |
10 | 1/2/2/1 | 22630876264783987200 | 37.80% |
10 | 1/2/2/2 | 19547717315744217600 | 32.65% |
10 | 2/0/0/0 | 17024558861445312500 | 28.43% |
10 | 2/0/0/1 | 16607805189889600500 | 27.74% |
10 | 2/0/0/2 | 14645689508606656500 | 24.46% |
10 | 2/0/1/0 | 15955781135956688000 | 26.65% |
10 | 2/0/1/1 | 15541999505377488000 | 25.96% |
10 | 2/0/1/2 | 13605404709763152000 | 22.72% |
10 | 2/0/2/0 | 12426449451498264000 | 20.75% |
10 | 2/0/2/1 | 12032775185385240000 | 20.10% |
10 | 2/0/2/2 | 10248283560354840000 | 17.12% |
10 | 2/1/0/0 | 15955781135956688000 | 26.65% |
10 | 2/1/0/1 | 15541999505377488000 | 25.96% |
10 | 2/1/0/2 | 13605404709763152000 | 22.72% |
10 | 2/1/1/0 | 14902442165355888000 | 24.89% |
10 | 2/1/1/1 | 14491632565753200000 | 24.20% |
10 | 2/1/1/2 | 12580558325807472000 | 21.01% |
10 | 2/1/2/0 | 11458807612389696000 | 19.14% |
10 | 2/1/2/1 | 11068105117253184000 | 18.49% |
10 | 2/1/2/2 | 9309126325891392000 | 15.55% |
10 | 2/2/0/0 | 12426449451498264000 | 20.75% |
10 | 2/2/0/1 | 12032775185385240000 | 20.10% |
10 | 2/2/0/2 | 10248283560354840000 | 17.12% |
10 | 2/2/1/0 | 11458807612389696000 | 19.14% |
10 | 2/2/1/1 | 11068105117253184000 | 18.49% |
10 | 2/2/1/2 | 9309126325891392000 | 15.55% |
10 | 2/2/2/0 | 8433284778321312000 | 14.09% |
10 | 2/2/2/1 | 8062683303650976000 | 13.47% |
10 | 2/2/2/2 | 6455639343273120000 | 10.78% |
11 | 0/0/0/0 | 5688000922764599609375 | 100.00% |
11 | 0/0/0/1 | 5635964362080762515487 | 99.09% |
11 | 0/0/0/2 | 5331298692270555014175 | 93.73% |
11 | 0/0/1/0 | 5519213532579421183106 | 97.03% |
11 | 0/0/1/1 | 5467308593599426356354 | 96.12% |
11 | 0/0/1/2 | 5163970109302961715330 | 90.79% |
11 | 0/0/2/0 | 4819602031232159880020 | 84.73% |
11 | 0/0/2/1 | 4768742753566023064404 | 83.84% |
11 | 0/0/2/2 | 4474989497979923525460 | 78.67% |
11 | 0/1/0/0 | 5519213532579421183106 | 97.03% |
11 | 0/1/0/1 | 5467308593599426356354 | 96.12% |
11 | 0/1/0/2 | 5163970109302961715330 | 90.79% |
11 | 0/1/1/0 | 5351355436133713979544 | 94.08% |
11 | 0/1/1/1 | 5299582118757561419928 | 93.17% |
11 | 0/1/1/2 | 4997570816344839639192 | 87.86% |
11 | 0/1/2/0 | 4657924818728051971672 | 81.89% |
11 | 0/1/2/1 | 4607197159805757423192 | 81.00% |
11 | 0/1/2/2 | 4314770991723400744536 | 75.86% |
11 | 0/2/0/0 | 4819602031232159880020 | 84.73% |
11 | 0/2/0/1 | 4768742753566023064404 | 83.84% |
11 | 0/2/0/2 | 4474989497979923525460 | 78.67% |
11 | 0/2/1/0 | 4657924818728051971672 | 81.89% |
11 | 0/2/1/1 | 4607197159805757423192 | 81.00% |
11 | 0/2/1/2 | 4314770991723400744536 | 75.86% |
11 | 0/2/2/0 | 4001866987946013609280 | 70.36% |
11 | 0/2/2/1 | 3952184913117577071936 | 69.48% |
11 | 0/2/2/2 | 3669341670873585495360 | 64.51% |
11 | 1/0/0/0 | 4014568485868457031250 | 70.58% |
11 | 1/0/0/1 | 3970048790693970902610 | 69.80% |
11 | 1/0/0/2 | 3717856624343271101010 | 65.36% |
11 | 1/0/1/0 | 3875936984128016447640 | 68.14% |
11 | 1/0/1/1 | 3831545240312885598360 | 67.36% |
11 | 1/0/1/2 | 3580629015820206481560 | 62.95% |
11 | 1/0/2/0 | 3322504874224738585240 | 58.41% |
11 | 1/0/2/1 | 3279118417934108881560 | 57.65% |
11 | 1/0/2/2 | 3037274985594573111960 | 53.40% |
11 | 1/1/0/0 | 3875936984128016447640 | 68.14% |
11 | 1/1/0/1 | 3831545240312885598360 | 67.36% |
11 | 1/1/0/2 | 3580629015820206481560 | 62.95% |
11 | 1/1/1/0 | 3738184234020533359920 | 65.72% |
11 | 1/1/1/1 | 3693920441464757790000 | 64.94% |
11 | 1/1/1/2 | 3444280155200099358000 | 60.55% |
11 | 1/1/2/0 | 3190494976469069160320 | 56.09% |
11 | 1/1/2/1 | 3147236468577794736000 | 55.33% |
11 | 1/1/2/2 | 2906668880086279651200 | 51.10% |
11 | 1/2/0/0 | 3322504874224738585240 | 58.41% |
11 | 1/2/0/1 | 3279118417934108881560 | 57.65% |
11 | 1/2/0/2 | 3037274985594573111960 | 53.40% |
11 | 1/2/1/0 | 3190494976469069160320 | 56.09% |
11 | 1/2/1/1 | 3147236468577794736000 | 55.33% |
11 | 1/2/1/2 | 2906668880086279651200 | 51.10% |
11 | 1/2/2/0 | 2676727347561099381120 | 47.06% |
11 | 1/2/2/1 | 2634474049974326102400 | 46.32% |
11 | 1/2/2/2 | 2402976950763954364800 | 42.25% |
11 | 2/0/0/0 | 1848950038120507812500 | 32.51% |
11 | 2/0/0/1 | 1820331404600417956500 | 32.00% |
11 | 2/0/0/2 | 1669049821825694500500 | 29.34% |
11 | 2/0/1/0 | 1766541379243137783000 | 31.06% |
11 | 2/0/1/1 | 1738035168701881335000 | 30.56% |
11 | 2/0/1/2 | 1587832436801631735000 | 27.92% |
11 | 2/0/2/0 | 1460870949753391176000 | 25.68% |
11 | 2/0/2/1 | 1433214742931417160000 | 25.20% |
11 | 2/0/2/2 | 1290310984332389448000 | 22.68% |
11 | 2/1/0/0 | 1766541379243137783000 | 31.06% |
11 | 2/1/0/1 | 1738035168701881335000 | 30.56% |
11 | 2/1/0/2 | 1587832436801631735000 | 27.92% |
11 | 2/1/1/0 | 1684842998310346160000 | 29.62% |
11 | 2/1/1/1 | 1656449210647923120000 | 29.12% |
11 | 2/1/1/2 | 1507325325992147376000 | 26.50% |
11 | 2/1/2/0 | 1383588052718517360000 | 24.32% |
11 | 2/1/2/1 | 1356044265915376752000 | 23.84% |
11 | 2/1/2/2 | 1214219260180822896000 | 21.35% |
11 | 2/2/0/0 | 1460870949753391176000 | 25.68% |
11 | 2/2/0/1 | 1433214742931417160000 | 25.20% |
11 | 2/2/0/2 | 1290310984332389448000 | 22.68% |
11 | 2/2/1/0 | 1383588052718517360000 | 24.32% |
11 | 2/2/1/1 | 1356044265915376752000 | 23.84% |
11 | 2/2/1/2 | 1214219260180822896000 | 21.35% |
11 | 2/2/2/0 | 1106842486733466912000 | 19.46% |
11 | 2/2/2/1 | 1080148626429608736000 | 18.99% |
11 | 2/2/2/2 | 945620291124276768000 | 16.62% |
12 | 0/0/0/0 | 540360087662636962890625 | 100.00% |
12 | 0/0/0/1 | 537133820900239063069569 | 99.40% |
12 | 0/0/0/2 | 516527342869439573889921 | 95.59% |
12 | 0/0/1/0 | 528713757739859651478064 | 97.84% |
12 | 0/0/1/1 | 525492229358800073273904 | 97.25% |
12 | 0/0/1/2 | 504937873522722121880112 | 93.44% |
12 | 0/0/2/0 | 476052092002083982482136 | 88.10% |
12 | 0/0/2/1 | 472871629592623191624408 | 87.51% |
12 | 0/0/2/2 | 452731355636833012640472 | 83.78% |
12 | 0/1/0/0 | 528713757739859651478064 | 97.84% |
12 | 0/1/0/1 | 525492229358800073273904 | 97.25% |
12 | 0/1/0/2 | 504937873522722121880112 | 93.44% |
12 | 0/1/1/0 | 517107387447879602641904 | 95.70% |
12 | 0/1/1/1 | 513890597447158346054640 | 95.10% |
12 | 0/1/1/2 | 493388363766201932446704 | 91.31% |
12 | 0/1/2/0 | 464735661356818955130560 | 86.00% |
12 | 0/1/2/1 | 461559937296496485889728 | 85.42% |
12 | 0/1/2/2 | 441471784363267844691648 | 81.70% |
12 | 0/2/0/0 | 476052092002083982482136 | 88.10% |
12 | 0/2/0/1 | 472871629592623191624408 | 87.51% |
12 | 0/2/0/2 | 452731355636833012640472 | 83.78% |
12 | 0/2/1/0 | 464735661356818955130560 | 86.00% |
12 | 0/2/1/1 | 461559937296496485889728 | 85.42% |
12 | 0/2/1/2 | 441471784363267844691648 | 81.70% |
12 | 0/2/2/0 | 414292371055537287725984 | 76.67% |
12 | 0/2/2/1 | 411157712043293605831584 | 76.09% |
12 | 0/2/2/2 | 391483610411232737043360 | 72.45% |
12 | 1/0/0/0 | 398118330526464843750000 | 73.68% |
12 | 1/0/0/1 | 395282940770553194121840 | 73.15% |
12 | 1/0/0/2 | 377653141481456687180400 | 69.89% |
12 | 1/0/1/0 | 388251198021927065054320 | 71.85% |
12 | 1/0/1/1 | 385420451218397075360880 | 71.33% |
12 | 1/0/1/2 | 367841320667605259046000 | 68.07% |
12 | 1/0/2/0 | 344998169478909602968000 | 63.85% |
12 | 1/0/2/1 | 342207343499498460434880 | 63.33% |
12 | 1/0/2/2 | 325026306808409097777600 | 60.15% |
12 | 1/1/0/0 | 388251198021927065054320 | 71.85% |
12 | 1/1/0/1 | 385420451218397075360880 | 71.33% |
12 | 1/1/0/2 | 367841320667605259046000 | 68.07% |
12 | 1/1/1/0 | 378422357258671595950080 | 70.03% |
12 | 1/1/1/1 | 375596253406523266191360 | 69.51% |
12 | 1/1/1/2 | 358067791554436140503040 | 66.26% |
12 | 1/1/2/0 | 335443499225136872581440 | 62.08% |
12 | 1/1/2/1 | 332657316165907389983040 | 61.56% |
12 | 1/1/2/2 | 315526947040962717952320 | 58.39% |
12 | 1/2/0/0 | 344998169478909602968000 | 63.85% |
12 | 1/2/0/1 | 342207343499498460434880 | 63.33% |
12 | 1/2/0/2 | 325026306808409097777600 | 60.15% |
12 | 1/2/1/0 | 335443499225136872581440 | 62.08% |
12 | 1/2/1/1 | 332657316165907389983040 | 61.56% |
12 | 1/2/1/2 | 315526947040962717952320 | 58.39% |
12 | 1/2/2/0 | 294256411125368012006400 | 54.46% |
12 | 1/2/2/1 | 291510147966737376568320 | 53.95% |
12 | 1/2/2/2 | 274777842122375158195200 | 50.85% |
12 | 2/0/0/0 | 197306438098927734375000 | 36.51% |
12 | 2/0/0/1 | 195373072204138200576600 | 36.16% |
12 | 2/0/0/2 | 184040093330182617600600 | 34.06% |
12 | 2/0/1/0 | 191058012207758496798400 | 35.36% |
12 | 2/0/1/1 | 189128848824012184401600 | 35.00% |
12 | 2/0/1/2 | 177840389449674630993600 | 32.91% |
12 | 2/0/2/0 | 165346510638019047594400 | 30.60% |
12 | 2/0/2/1 | 163452423223668758493600 | 30.25% |
12 | 2/0/2/2 | 152500565322167048157600 | 28.22% |
12 | 2/1/0/0 | 191058012207758496798400 | 35.36% |
12 | 2/1/0/1 | 189128848824012184401600 | 35.00% |
12 | 2/1/0/2 | 177840389449674630993600 | 32.91% |
12 | 2/1/1/0 | 184841813005089921595200 | 34.21% |
12 | 2/1/1/1 | 182916852131386830600000 | 33.85% |
12 | 2/1/1/2 | 171672912217067306760000 | 31.77% |
12 | 2/1/2/0 | 159351918154058935219200 | 29.49% |
12 | 2/1/2/1 | 157462033218551867520000 | 29.14% |
12 | 2/1/2/2 | 146554693644508186752000 | 27.12% |
12 | 2/2/0/0 | 165346510638019047594400 | 30.60% |
12 | 2/2/0/1 | 163452423223668758493600 | 30.25% |
12 | 2/2/0/2 | 152500565322167048157600 | 28.22% |
12 | 2/2/1/0 | 159351918154058935219200 | 29.49% |
12 | 2/2/1/1 | 157462033218551867520000 | 29.14% |
12 | 2/2/1/2 | 146554693644508186752000 | 27.12% |
12 | 2/2/2/0 | 135239654279178304627200 | 25.03% |
12 | 2/2/2/1 | 133384844389547260224000 | 24.68% |
12 | 2/2/2/2 | 122814075709219422528000 | 22.73% |
13 | 0/0/0/0 | 51334208327950511474609375 | 100.00% |
13 | 0/0/0/1 | 51134179788681841685703903 | 99.61% |
13 | 0/0/0/2 | 49750111347613142662470879 | 96.91% |
13 | 0/0/1/0 | 50530611563278876987142666 | 98.43% |
13 | 0/0/1/1 | 50330753605738386776445450 | 98.05% |
13 | 0/0/1/2 | 48948717930263827726860810 | 95.35% |
13 | 0/0/2/0 | 46594152049380145729697048 | 90.77% |
13 | 0/0/2/1 | 46395895664732008225510680 | 90.38% |
13 | 0/0/2/2 | 45031477291073328947545368 | 87.72% |
13 | 0/1/0/0 | 50530611563278876987142666 | 98.43% |
13 | 0/1/0/1 | 50330753605738386776445450 | 98.05% |
13 | 0/1/0/2 | 48948717930263827726860810 | 95.35% |
13 | 0/1/1/0 | 49728733062731524790461200 | 96.87% |
13 | 0/1/1/1 | 49529045686909214157972240 | 96.48% |
13 | 0/1/1/2 | 48149042776599795082035984 | 93.80% |
13 | 0/1/2/0 | 45805779904042268283839120 | 89.23% |
13 | 0/1/2/1 | 45607694100774310357861008 | 88.84% |
13 | 0/1/2/2 | 44245308478895971053544080 | 86.19% |
13 | 0/2/0/0 | 46594152049380145729697048 | 90.77% |
13 | 0/2/0/1 | 46395895664732008225510680 | 90.38% |
13 | 0/2/0/2 | 45031477291073328947545368 | 87.72% |
13 | 0/2/1/0 | 45805779904042268283839120 | 89.23% |
13 | 0/2/1/1 | 45607694100774310357861008 | 88.84% |
13 | 0/2/1/2 | 44245308478895971053544080 | 86.19% |
13 | 0/2/2/0 | 41980826345942689039006432 | 81.78% |
13 | 0/2/2/1 | 41784342104683483819539168 | 81.40% |
13 | 0/2/2/2 | 40439573388430944286841568 | 78.78% |
13 | 1/0/0/0 | 39243658971375881347656250 | 76.45% |
13 | 1/0/0/1 | 39063956036444496568781370 | 76.10% |
13 | 1/0/0/2 | 37847573831158398878300730 | 73.73% |
13 | 1/0/1/0 | 38545034854380379290485520 | 75.09% |
13 | 1/0/1/1 | 38365500020024300886082320 | 74.74% |
13 | 1/0/1/2 | 37151109641309935307596560 | 72.37% |
13 | 1/0/2/0 | 35209944067846610091345680 | 68.59% |
13 | 1/0/2/1 | 35031978551395532744877840 | 68.24% |
13 | 1/0/2/2 | 33834714206228152598169360 | 65.91% |
13 | 1/1/0/0 | 38545034854380379290485520 | 75.09% |
13 | 1/1/0/1 | 38365500020024300886082320 | 74.74% |
13 | 1/1/0/2 | 37151109641309935307596560 | 72.37% |
13 | 1/1/1/0 | 37848073961155166075596320 | 73.73% |
13 | 1/1/1/1 | 37668707227364394045664800 | 73.38% |
13 | 1/1/1/2 | 36456308674792760579173920 | 71.02% |
13 | 1/1/2/0 | 34525925783174817518363200 | 67.26% |
13 | 1/1/2/1 | 34348128366951046546367040 | 66.91% |
13 | 1/1/2/2 | 33152855834541598511653440 | 64.58% |
13 | 1/2/0/0 | 35209944067846610091345680 | 68.59% |
13 | 1/2/0/1 | 35031978551395532744877840 | 68.24% |
13 | 1/2/0/2 | 33834714206228152598169360 | 65.91% |
13 | 1/2/1/0 | 34525925783174817518363200 | 67.26% |
13 | 1/2/1/1 | 34348128366951046546367040 | 66.91% |
13 | 1/2/1/2 | 33152855834541598511653440 | 64.58% |
13 | 1/2/2/0 | 31296447237399634647705920 | 60.97% |
13 | 1/2/2/1 | 31120219128197264733645120 | 60.62% |
13 | 1/2/2/2 | 29942072233144722130708800 | 58.33% |
13 | 2/0/0/0 | 20752230543673505859375000 | 40.43% |
13 | 2/0/0/1 | 20623341619585333605576600 | 40.17% |
13 | 2/0/0/2 | 19793927650720623606063000 | 38.56% |
13 | 2/0/1/0 | 20284902091049143055398800 | 39.52% |
13 | 2/0/1/1 | 20156168861771911157389200 | 39.26% |
13 | 2/0/1/2 | 19328557770144743139162000 | 37.65% |
13 | 2/0/2/0 | 18172934139833940754508000 | 35.40% |
13 | 2/0/2/1 | 18045621359289317690239200 | 35.15% |
13 | 2/0/2/2 | 17233057858533043665996000 | 33.57% |
13 | 2/1/0/0 | 20284902091049143055398800 | 39.52% |
13 | 2/1/0/1 | 20156168861771911157389200 | 39.26% |
13 | 2/1/0/2 | 19328557770144743139162000 | 37.65% |
13 | 2/1/1/0 | 19819020036558125205659200 | 38.61% |
13 | 2/1/1/1 | 19690442502081833663438400 | 38.36% |
13 | 2/1/1/2 | 18864634287263207626497600 | 36.75% |
13 | 2/1/2/0 | 17717944706056146786977600 | 34.51% |
13 | 2/1/2/1 | 17590787619974464078497600 | 34.27% |
13 | 2/1/2/2 | 16780026982641932035540800 | 32.69% |
13 | 2/2/0/0 | 18172934139833940754508000 | 35.40% |
13 | 2/2/0/1 | 18045621359289317690239200 | 35.15% |
13 | 2/2/0/2 | 17233057858533043665996000 | 33.57% |
13 | 2/2/1/0 | 17717944706056146786977600 | 34.51% |
13 | 2/2/1/1 | 17590787619974464078497600 | 34.27% |
13 | 2/2/1/2 | 16780026982641932035540800 | 32.69% |
13 | 2/2/2/0 | 15691772446477628804160000 | 30.57% |
13 | 2/2/2/1 | 15566035798244954929420800 | 30.32% |
13 | 2/2/2/2 | 14770322355593236880448000 | 28.77% |
14 | 0/0/0/0 | 4876749791155298590087890625 | 100.00% |
14 | 0/0/0/1 | 4864348021720641063175751361 | 99.75% |
14 | 0/0/0/2 | 4771934836578515620701423297 | 97.85% |
14 | 0/0/1/0 | 4821301614392955810452687704 | 98.86% |
14 | 0/0/1/1 | 4808905985900512748356045656 | 98.61% |
14 | 0/0/1/2 | 4716571609516806271013931864 | 96.72% |
14 | 0/0/2/0 | 4528792392052480857014805628 | 92.86% |
14 | 0/0/2/1 | 4516458855309095161385968764 | 92.61% |
14 | 0/0/2/2 | 4424864405601655634451866748 | 90.73% |
14 | 0/1/0/0 | 4821301614392955810452687704 | 98.86% |
14 | 0/1/0/1 | 4808905985900512748356045656 | 98.61% |
14 | 0/1/0/2 | 4716571609516806271013931864 | 96.72% |
14 | 0/1/1/0 | 4765927322987957169321250232 | 97.73% |
14 | 0/1/1/1 | 4753537835437628572040105400 | 97.47% |
14 | 0/1/1/2 | 4661282267807721059830205880 | 95.58% |
14 | 0/1/2/0 | 4474043548788720969729196608 | 91.74% |
14 | 0/1/2/1 | 4461716152983809738915856960 | 91.49% |
14 | 0/1/2/2 | 4370200511874013177113969216 | 89.61% |
14 | 0/2/0/0 | 4528792392052480857014805628 | 92.86% |
14 | 0/2/0/1 | 4516458855309095161385968764 | 92.61% |
14 | 0/2/0/2 | 4424864405601655634451866748 | 90.73% |
14 | 0/2/1/0 | 4474043548788720969729196608 | 91.74% |
14 | 0/2/1/1 | 4461716152983809738915856960 | 91.49% |
14 | 0/2/1/2 | 4370200511874013177113969216 | 89.61% |
14 | 0/2/2/0 | 4187076087885733579436910816 | 85.86% |
14 | 0/2/2/1 | 4174810783703207715091376352 | 85.61% |
14 | 0/2/2/2 | 4084035064241454903697500384 | 83.75% |
14 | 1/0/0/0 | 3849053095846455029296875000 | 78.93% |
14 | 1/0/0/1 | 3837708257837336322906326520 | 78.69% |
14 | 1/0/0/2 | 3754685501899036555066131960 | 76.99% |
14 | 1/0/1/0 | 3799798305297004063049134840 | 77.92% |
14 | 1/0/1/1 | 3788459543720125118176932600 | 77.68% |
14 | 1/0/1/2 | 3705514450247616895342654200 | 75.98% |
14 | 1/0/2/0 | 3545499126710641314238989120 | 72.70% |
14 | 1/0/2/1 | 3534221553743173889674478400 | 72.47% |
14 | 1/0/2/2 | 3452001485142776155606336320 | 70.78% |
14 | 1/1/0/0 | 3799798305297004063049134840 | 77.92% |
14 | 1/1/0/1 | 3788459543720125118176932600 | 77.68% |
14 | 1/1/0/2 | 3705514450247616895342654200 | 75.98% |
14 | 1/1/1/0 | 3750615583773215451504537600 | 76.91% |
14 | 1/1/1/1 | 3739282898628476268150681600 | 76.68% |
14 | 1/1/1/2 | 3656415467617139590322319360 | 74.98% |
14 | 1/1/2/0 | 3496921818639237841284868800 | 71.71% |
14 | 1/1/2/1 | 3485650322100270178238704320 | 71.47% |
14 | 1/1/2/2 | 3403507915804887989176478400 | 69.79% |
14 | 1/2/0/0 | 3545499126710641314238989120 | 72.70% |
14 | 1/2/0/1 | 3534221553743173889674478400 | 72.47% |
14 | 1/2/0/2 | 3452001485142776155606336320 | 70.78% |
14 | 1/2/1/0 | 3496921818639237841284868800 | 71.71% |
14 | 1/2/1/1 | 3485650322100270178238704320 | 71.47% |
14 | 1/2/1/2 | 3403507915804887989176478400 | 69.79% |
14 | 1/2/2/0 | 3247939163018705344719246080 | 66.60% |
14 | 1/2/2/1 | 3236728854962477201980773120 | 66.37% |
14 | 1/2/2/2 | 3155311468510982301684683520 | 64.70% |
14 | 2/0/0/0 | 2156376185926006811523437500 | 44.22% |
14 | 2/0/0/1 | 2147876932524108006537171900 | 44.04% |
14 | 2/0/0/2 | 2088330249595372425282311100 | 42.82% |
14 | 2/0/1/0 | 2121817566051214385517134400 | 43.51% |
14 | 2/0/1/1 | 2113324041720153093526094400 | 43.33% |
14 | 2/0/1/2 | 2053849289794071956645659200 | 42.12% |
14 | 2/0/2/0 | 1951710009295946324869797600 | 40.02% |
14 | 2/0/2/1 | 1943273157876067322385880800 | 39.85% |
14 | 2/0/2/2 | 1884454653264451466693695200 | 38.64% |
14 | 2/1/0/0 | 2121817566051214385517134400 | 43.51% |
14 | 2/1/0/1 | 2113324041720153093526094400 | 43.33% |
14 | 2/1/0/2 | 2053849289794071956645659200 | 42.12% |
14 | 2/1/1/0 | 2087323309552525231423454400 | 42.80% |
14 | 2/1/1/1 | 2078835514292201452427640000 | 42.63% |
14 | 2/1/1/2 | 2019432693364154759921630400 | 41.41% |
14 | 2/1/2/0 | 1917742241717794734118240000 | 39.32% |
14 | 2/1/2/1 | 1909311119365013244629548800 | 39.15% |
14 | 2/1/2/2 | 1850564545595275833311788800 | 37.95% |
14 | 2/2/0/0 | 1951710009295946324869797600 | 40.02% |
14 | 2/2/0/1 | 1943273157876067322385880800 | 39.85% |
14 | 2/2/0/2 | 1884454653264451466693695200 | 38.64% |
14 | 2/2/1/0 | 1917742241717794734118240000 | 39.32% |
14 | 2/2/1/1 | 1909311119365013244629548800 | 39.15% |
14 | 2/2/1/2 | 1850564545595275833311788800 | 37.95% |
14 | 2/2/2/0 | 1752126087822677729937174400 | 35.93% |
14 | 2/2/2/1 | 1743751638254406529955606400 | 35.76% |
14 | 2/2/2/2 | 1685661306770911199826096000 | 34.57% |
15 | 0/0/0/0 | 463291230159753366058349609375 | 100.00% |
15 | 0/0/0/1 | 462522320454804599389796975007 | 99.83% |
15 | 0/0/0/2 | 456383444584649123568288039327 | 98.51% |
15 | 0/0/1/0 | 459465305963151714263520607826 | 99.17% |
15 | 0/0/1/1 | 458696617332122668328325873234 | 99.01% |
15 | 0/0/1/2 | 452560781228363352590488059474 | 97.68% |
15 | 0/0/2/0 | 437840517025838030205791468636 | 94.51% |
15 | 0/0/2/1 | 437074223362272625548640648284 | 94.34% |
15 | 0/0/2/2 | 430969122674296706212366400604 | 93.02% |
15 | 0/1/0/0 | 459465305963151714263520607826 | 99.17% |
15 | 0/1/0/1 | 458696617332122668328325873234 | 99.01% |
15 | 0/1/0/2 | 452560781228363352590488059474 | 97.68% |
15 | 0/1/1/0 | 455642558836915860424353520584 | 98.35% |
15 | 0/1/1/1 | 454874091279805535222516685768 | 98.18% |
15 | 0/1/1/2 | 448741294942392879568349993928 | 96.86% |
15 | 0/1/2/0 | 434046585188966390383092906504 | 93.69% |
15 | 0/1/2/1 | 433280512599280706459299985928 | 93.52% |
15 | 0/1/2/2 | 427178451675849647206696860168 | 92.21% |
15 | 0/2/0/0 | 437840517025838030205791468636 | 94.51% |
15 | 0/2/0/1 | 437074223362272625548640648284 | 94.34% |
15 | 0/2/0/2 | 430969122674296706212366400604 | 93.02% |
15 | 0/2/1/0 | 434046585188966390383092906504 | 93.69% |
15 | 0/2/1/1 | 433280512599280706459299985928 | 93.52% |
15 | 0/2/1/2 | 427178451675849647206696860168 | 92.21% |
15 | 0/2/2/0 | 412694536316100034341705388704 | 89.08% |
15 | 0/2/2/1 | 411930858692419391695956382368 | 88.91% |
15 | 0/2/2/2 | 405859533122069088844916822688 | 87.60% |
15 | 1/0/0/0 | 375937011058501663391113281250 | 81.14% |
15 | 1/0/0/1 | 375223061787680915389683367650 | 80.99% |
15 | 1/0/0/2 | 369607366973167155726361870050 | 79.78% |
15 | 1/0/1/0 | 372476496648460628586144582600 | 80.40% |
15 | 1/0/1/1 | 371762766774300259032346643400 | 80.24% |
15 | 1/0/1/2 | 366150079793745181320606534600 | 79.03% |
15 | 1/0/2/0 | 353267128334174751749525920200 | 76.25% |
15 | 1/0/2/1 | 352555768268587889187883014600 | 76.10% |
15 | 1/0/2/2 | 346973369649691514028450208200 | 74.89% |
15 | 1/1/0/0 | 372476496648460628586144582600 | 80.40% |
15 | 1/1/0/1 | 371762766774300259032346643400 | 80.24% |
15 | 1/1/0/2 | 366150079793745181320606534600 | 79.03% |
15 | 1/1/1/0 | 369019099369839892871417254800 | 79.65% |
15 | 1/1/1/1 | 368305588892338901765251290000 | 79.50% |
15 | 1/1/1/2 | 362695909745693006005092570000 | 78.29% |
15 | 1/1/2/0 | 349837837975562334369024331200 | 75.51% |
15 | 1/1/2/1 | 349126697306595850255013400000 | 75.36% |
15 | 1/1/2/2 | 343547306519806857047161982400 | 74.15% |
15 | 1/2/0/0 | 353267128334174751749525920200 | 76.25% |
15 | 1/2/0/1 | 352555768268587889187883014600 | 76.10% |
15 | 1/2/0/2 | 346973369649691514028450208200 | 74.89% |
15 | 1/2/1/0 | 349837837975562334369024331200 | 75.51% |
15 | 1/2/1/1 | 349126697306595850255013400000 | 75.36% |
15 | 1/2/1/2 | 343547306519806857047161982400 | 74.15% |
15 | 1/2/2/0 | 330892687827714979916917406400 | 71.42% |
15 | 1/2/2/1 | 330183916965863402795061508800 | 71.27% |
15 | 1/2/2/2 | 324634814478030472139517393600 | 70.07% |
15 | 2/0/0/0 | 221782506762175129272460937500 | 47.87% |
15 | 2/0/0/1 | 221227097205185204349269641500 | 47.75% |
15 | 2/0/0/2 | 217019966771245295881068169500 | 46.84% |
15 | 2/0/1/0 | 219251000284067866475611653000 | 47.32% |
15 | 2/0/1/1 | 218695800447242114505479685000 | 47.20% |
15 | 2/0/1/2 | 214491505903366774969914885000 | 46.30% |
15 | 2/0/2/0 | 205773138532898820333153444000 | 44.42% |
15 | 2/0/2/1 | 205220173033699698431159460000 | 44.30% |
15 | 2/0/2/2 | 201043931580859592201620644000 | 43.39% |
15 | 2/1/0/0 | 219251000284067866475611653000 | 47.32% |
15 | 2/1/0/1 | 218695800447242114505479685000 | 47.20% |
15 | 2/1/0/2 | 214491505903366774969914885000 | 46.30% |
15 | 2/1/1/0 | 216722338487628635198910360000 | 46.78% |
15 | 2/1/1/1 | 216167348370966056181837720000 | 46.66% |
15 | 2/1/1/2 | 211965889717105785578909592000 | 45.75% |
15 | 2/1/2/0 | 203269578453139865102375160000 | 43.88% |
15 | 2/1/2/1 | 202716822674064916153440504000 | 43.76% |
15 | 2/1/2/2 | 198543417109438078856538360000 | 42.85% |
15 | 2/2/0/0 | 205773138532898820333153444000 | 44.42% |
15 | 2/2/0/1 | 205220173033699698431159460000 | 44.30% |
15 | 2/2/0/2 | 201043931580859592201620644000 | 43.39% |
15 | 2/2/1/0 | 203269578453139865102375160000 | 43.88% |
15 | 2/2/1/1 | 202716822674064916153440504000 | 43.76% |
15 | 2/2/1/2 | 198543417109438078856538360000 | 42.85% |
15 | 2/2/2/0 | 190022149097660744709267696000 | 41.02% |
15 | 2/2/2/1 | 189471627654753825828471024000 | 40.90% |
15 | 2/2/2/2 | 185326275118459581837594864000 | 40.00% |
16 | 0/0/0/0 | 44012666865176569775543212890625 | 100.00% |
16 | 0/0/0/1 | 43964994463469746242092949559809 | 99.89% |
16 | 0/0/0/2 | 43559010139256797441097158613505 | 98.97% |
16 | 0/0/1/0 | 43748678095611055801700011783744 | 99.40% |
16 | 0/0/1/1 | 43701013652565342214650632844864 | 99.29% |
16 | 0/0/1/2 | 43295146055382005960867812980288 | 98.37% |
16 | 0/0/2/0 | 42157093629824768655051147139360 | 95.78% |
16 | 0/0/2/1 | 42109521153529658893078654507296 | 95.68% |
16 | 0/0/2/2 | 41704918099167125234103021361440 | 94.76% |
16 | 0/1/0/0 | 43748678095611055801700011783744 | 99.40% |
16 | 0/1/0/1 | 43701013652565342214650632844864 | 99.29% |
16 | 0/1/0/2 | 43295146055382005960867812980288 | 98.37% |
16 | 0/1/1/0 | 43484825940071271139950272992064 | 98.80% |
16 | 0/1/1/1 | 43437169455686657499301778445120 | 98.69% |
16 | 0/1/1/2 | 43031418585532405792731929662272 | 97.77% |
16 | 0/1/2/0 | 41894563135557155942856764699392 | 95.19% |
16 | 0/1/2/1 | 41846998617922730127285156459264 | 95.08% |
16 | 0/1/2/2 | 41442512290568689015522494395136 | 94.16% |
16 | 0/2/0/0 | 42157093629824768655051147139360 | 95.78% |
16 | 0/2/0/1 | 42109521153529658893078654507296 | 95.68% |
16 | 0/2/0/2 | 41704918099167125234103021361440 | 94.76% |
16 | 0/2/1/0 | 41894563135557155942856764699392 | 95.19% |
16 | 0/2/1/1 | 41846998617922730127285156459264 | 95.08% |
16 | 0/2/1/2 | 41442512290568689015522494395136 | 94.16% |
16 | 0/2/2/0 | 40316287491418553776614162852480 | 91.60% |
16 | 0/2/2/1 | 40268814940518091786119440919168 | 91.49% |
16 | 0/2/2/2 | 39865593155214712469163965573760 | 90.58% |
16 | 1/0/0/0 | 36587558241570175048828125000000 | 83.13% |
16 | 1/0/0/1 | 36542743782438008486068243149120 | 83.03% |
16 | 1/0/0/2 | 36165778567444653541313248768320 | 82.17% |
16 | 1/0/1/0 | 36345128649411737477386681764160 | 82.58% |
16 | 1/0/1/1 | 36300322105331937961598810245440 | 82.48% |
16 | 1/0/1/2 | 35923472731775262837193498347840 | 81.62% |
16 | 1/0/2/0 | 34905554654834666998519703125760 | 79.31% |
16 | 1/0/2/1 | 34860839379765584916946732957440 | 79.21% |
16 | 1/0/2/2 | 34485241265135721484399278800640 | 78.35% |
16 | 1/1/0/0 | 36345128649411737477386681764160 | 82.58% |
16 | 1/1/0/1 | 36300322105331937961598810245440 | 82.48% |
16 | 1/1/0/2 | 35923472731775262837193498347840 | 81.62% |
16 | 1/1/1/0 | 36102833693293827755479822909440 | 82.03% |
16 | 1/1/1/1 | 36058035064266385286663961722880 | 81.93% |
16 | 1/1/1/2 | 35681301532145861982608332308480 | 81.07% |
16 | 1/1/2/0 | 34664556425387601698153254544640 | 78.76% |
16 | 1/1/2/1 | 34619849065370460663552294708480 | 78.66% |
16 | 1/1/2/2 | 34244366792156157051354523034880 | 77.81% |
16 | 1/2/0/0 | 34905554654834666998519703125760 | 79.31% |
16 | 1/2/0/1 | 34860839379765584916946732957440 | 79.21% |
16 | 1/2/0/2 | 34485241265135721484399278800640 | 78.35% |
16 | 1/2/1/0 | 34664556425387601698153254544640 | 78.76% |
16 | 1/2/1/1 | 34619849065370460663552294708480 | 78.66% |
16 | 1/2/1/2 | 34244366792156157051354523034880 | 77.81% |
16 | 1/2/2/0 | 33237971636204836067864593520640 | 75.52% |
16 | 1/2/2/1 | 33193355545181772467478535034880 | 75.42% |
16 | 1/2/2/2 | 32819124530124139747138621102080 | 74.57% |
16 | 2/0/0/0 | 22610883185369902622070312500000 | 51.37% |
16 | 2/0/0/1 | 22574862395698219046050065972000 | 51.29% |
16 | 2/0/0/2 | 22281606149607538686605061684000 | 50.63% |
16 | 2/0/1/0 | 22426919159061163769006517728000 | 50.96% |
16 | 2/0/1/1 | 22390906016080352474242133472000 | 50.87% |
16 | 2/0/1/2 | 22097760502236355434012454368000 | 50.21% |
16 | 2/0/2/0 | 21373812464168542445517215376000 | 48.56% |
16 | 2/0/2/1 | 21337886564776027099225511568000 | 48.48% |
16 | 2/0/2/2 | 21045920781198890734972688016000 | 47.82% |
16 | 2/1/0/0 | 22426919159061163769006517728000 | 50.96% |
16 | 2/1/0/1 | 22390906016080352474242133472000 | 50.87% |
16 | 2/1/0/2 | 22097760502236355434012454368000 | 50.21% |
16 | 2/1/1/0 | 22243080178561672947010020384000 | 50.54% |
16 | 2/1/1/1 | 22207074682271723933501498400000 | 50.46% |
16 | 2/1/1/2 | 21914039900673882212487144480000 | 49.79% |
16 | 2/1/2/0 | 21191156871242952735902282496000 | 48.15% |
16 | 2/1/2/1 | 21155238618540883670866440960000 | 48.07% |
16 | 2/1/2/2 | 20863383567189310625828942592000 | 47.40% |
16 | 2/2/0/0 | 21373812464168542445517215376000 | 48.56% |
16 | 2/2/0/1 | 21337886564776027099225511568000 | 48.48% |
16 | 2/2/0/2 | 21045920781198890734972688016000 | 47.82% |
16 | 2/2/1/0 | 21191156871242952735902282496000 | 48.15% |
16 | 2/2/1/1 | 21155238618540883670866440960000 | 48.07% |
16 | 2/2/1/2 | 20863383567189310625828942592000 | 47.40% |
16 | 2/2/2/0 | 20149675878063227359898516352000 | 45.78% |
16 | 2/2/2/1 | 20113844868932814243335355264000 | 45.70% |
16 | 2/2/2/2 | 19823169547077961074274712448000 | 45.04% |
Here's the C program that was used to produce the tables above:
/* * Copyright (c) 2011 Solar Designer <solar at openwall.com> * * Redistribution and use in source and binary forms, with or without * modification, are permitted. * * There's ABSOLUTELY NO WARRANTY, express or implied. */ #include <stdio.h> #include <assert.h> #define MIN_LENGTH 6 #if defined(__GNUC__) && defined(__LP64__) #define MAX_LENGTH 12 typedef __uint128_t count_t; #else #define MAX_LENGTH 9 typedef unsigned long long count_t; #endif #define MASK_BITS_PER_K 8 #define MASK_MASK_PER_K \ ((1 << MASK_BITS_PER_K) - 1) #define MASK_GET(mask, i) \ (((mask) >> ((i) * MASK_BITS_PER_K)) & MASK_MASK_PER_K) static char *count2str(count_t count) { static char out[40]; char *p; p = &out[sizeof(out) - 1]; *p-- = 0; do { *p-- = '0' + count % 10; } while (count /= 10); return ++p; } static count_t count(unsigned int length, unsigned int mask, unsigned int classes) { unsigned int k[MAX_LENGTH]; unsigned int i; count_t total = 0; assert(length <= sizeof(k) / sizeof(k[0])); for (i = 0; i < length; i++) k[i] = 0; goto start; while (1) { i = length - 1; while (++k[i] >= 4) { if (!i) return total; k[i--] = 0; } start: { unsigned int seen = 0, seen_classes = 0; for (i = 0; i < length; i++) { unsigned int shift = k[i] * MASK_BITS_PER_K; seen += 1 << shift; if (((seen >> shift) & MASK_MASK_PER_K) == 1) seen_classes++; } for (i = 0; i < 4; i++) if (MASK_GET(seen, i) < MASK_GET(mask, i)) break; if (i < 4 || seen_classes < classes) continue; } { count_t n = 1; for (i = 0; i < length; i++) { unsigned int m; switch (k[i]) { case 0: m = 10; break; case 1: m = 26; break; case 2: m = 26; break; default: m = 33; } assert(n * m > n); n *= m; } assert(total + n >= total); total += n; } } } int main(void) { unsigned int length, classes, digits, lowers, uppers, others; count_t total = 0; puts("| Length | Min classes | Password count | % of total |"); for (length = MIN_LENGTH; length <= MAX_LENGTH; length++) for (classes = 1; classes <= 4; classes++) { count_t current = count(length, 0, classes); if (classes == 1) total = current; printf("| %u | %u | %s | %.2f%% |\n", length, classes, count2str(current), 100.0 * current / total); if (length > 9) fflush(stdout); } puts("\n| Length | Min digits/lowers/uppers/others | Password count | % of total |"); for (length = MIN_LENGTH; length <= MAX_LENGTH; length++) for (digits = 0; digits <= 2; digits++) for (lowers = 0; lowers <= 2; lowers++) for (uppers = 0; uppers <= 2; uppers++) for (others = 0; others <= 2; others++) { unsigned int mask = digits | (lowers << MASK_BITS_PER_K) | (uppers << (2 * MASK_BITS_PER_K)) | (others << (3 * MASK_BITS_PER_K)); count_t current = count(length, mask, 0); if (!mask) total = current; printf("| %u | %u/%u/%u/%u | %s | %.2f%% |\n", length, digits, lowers, uppers, others, count2str(current), 100.0 * current / total); if (length > 9) fflush(stdout); } return 0; }
The following (lazy) python script computes the list using the combinatorial formula instead. This allows us to compute it much faster and extend it to password lengths beyond 40 (if implemented in C, it should be even faster).
## # Copyright (c) 2012 Sondre Rønjom <sondrer at gmail.com> # # Redistribution and use in source and binary forms, with or without # modification, are permitted. ## n1 = 10 # digits n2 = 26 # lowercase n3 = 26 # uppercase n4 = 33 # special # Max length of passwords MIN_LEN = 6 MAX_LEN = 50 # Change these parameters to change bounds on policies max_digit = 2 max_lower = 2 max_upper = 2 max_special = 2 # Cardinality of alphabets n1 = 10 # digits n2 = 26 # lowercase n3 = 26 # uppercase n4 = 33 # special def binomial(n, k): result = 1 for i in range(1, k+1): result = result * (n-i+1) / i return result def multinomial(t1,t2,t3,t4): t = t1+t2+t3+t4 total = binomial(t,t1)*binomial(t-t1,t2)*binomial(n-t1-t2,t3)*binomial(t4,t4) return total def prod(r1, r2,r3,r4): return pow(n1,r1)*pow(n2,r2)*pow(n3,r3)*pow(n4,r4) def count2(n,r1,r2,r3,r4): k = r1+r2+r3+r4; d = n-k; total = 0 for s1 in range(d+1): for s2 in range(d+1): for s3 in range(d+1): for s4 in range(d+1): if(s1+s2+s3+s4 == d): s = prod(s1,s2,s3,s4) total += multinomial(r1+s1,r2+s2,r3+s3,s4+r4)*s; return prod(r1,r2,r3,r4)*total print "\n| Length | Min digits/lowers/uppers/others | Password count | % of total |" for n in range(MIN_LEN,MAX_LEN+1): total = count2(n,0,0,0,0) for r1 in range(max_digit+1): for r2 in range(max_lower+1): for r3 in range(max_upper+1): for r4 in range(max_special+1): cnt = count2(n,r1,r2,r3,r4) print " ", n , " | ", r1,"/",r2,"/",r3,"/",r4," | ",cnt, " | ", 100*(float(cnt)/float(total))