Вот мое решение:
def base62(a):
baseit = (lambda a=a, b=62: (not a) and '0' or
baseit(a-a%b, b*62) + '0123456789abcdefghijklmnopqrstuvwxyz'
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[a%b%61 or -1*bool(a%b)])
return baseit()
Объяснение
В любой базе каждое число равно a1+a2*base**2+a3*base**3...
Таким образом, цель состоит в том, чтобы найти все a
s.
Для каждого N=1,2,3...
код выделяет aN*base**N
путем "модуляции" на b
для b=base**(N+1)
, которая разрезает все a
с больше, чем N
, и разрезает все a
с тем, чтобы их серийный номер меньше N
, уменьшая a
каждый раз, когда функция вызывается рекурсивно текущим aN*base**N
.
Base%(base-1)==1
поэтому base**p%(base-1)==1
и, следовательно, q*base^p%(base-1)==q
только с одним исключением, когда q==base-1
возвращает 0
. Чтобы исправить это, он возвращает 0
. Функция проверяет 0
с начала.
Преимущества
В этом примере есть только одно умножение (вместо деления) и несколько операций с модулями, которые все относительно быстрые.