Необходимо избавиться от части с 2 питанием N с самого начала.
2-е Редактирование волшебное выражение для m ниже должно быть
m = N - (N & (N-1));
и не, как записано
Конец 2-го редактирования
m = N & (N-1); // the lawest bit of N
N /= m;
byte = N & 0x0F;
if ((m % 2) || (byte !=1 && byte !=9))
return false;
1-е Редактирование:
Незначительное улучшение:
m = N & (N-1); // the lawest bit of N
N /= m;
if ((m % 2) || (N & 0x07 != 1))
return false;
Конец 1-го редактирования
Теперь продолжаются, как обычно. Таким образом, к тому времени, когда Вы добираетесь до части с плавающей точкой, Вы уже, избавился от всех чисел, чья часть с 2 питанием нечетна (приблизительно половина), и затем Вы только рассматриваете 1/8 того, что оставляют. Т.е. Вы выполняете часть с плавающей точкой на 6% чисел.
pycrypto имеет ветку Py3k (в https://github.com/dlitz/pycrypto/tree/py3k )