home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __revision__ = '$Id: number.py,v 1.13 2003/04/04 18:21:07 akuchling Exp $'
- bignum = long
-
- try:
- from Crypto.PublicKey import _fastmath
- except ImportError:
- _fastmath = None
-
-
- def size(N):
- (bits, power) = (0, 0x1L)
- while N >= power:
- bits += 1
- power = power << 1
- return bits
-
-
- def getRandomNumber(N, randfunc):
- S = randfunc(N / 8)
- odd_bits = N % 8
- if odd_bits != 0:
- char = ord(randfunc(1)) >> 8 - odd_bits
- S = chr(char) + S
-
- value = bytes_to_long(S)
- value |= 0x2L ** (N - 1)
- return value
-
-
- def GCD(x, y):
- x = abs(x)
- y = abs(y)
- while x > 0:
- x = y % x
- y = x
- return y
-
-
- def inverse(u, v):
- u3 = long(u)
- v3 = long(v)
- (u1, v1) = (0x1L, 0x0L)
- while v3 > 0:
- q = u3 / v3
- u1 = v1
- v1 = u1 - v1 * q
- u3 = v3
- v3 = u3 - v3 * q
- while u1 < 0:
- u1 = u1 + v
- return u1
-
-
- def getPrime(N, randfunc):
- number = getRandomNumber(N, randfunc) | 1
- while not isPrime(number):
- number = number + 2
- return number
-
-
- def isPrime(N):
- if N == 1:
- return 0
- if N in sieve:
- return 1
- for i in sieve:
- if N % i == 0:
- return 0
-
- if _fastmath is not None:
- return _fastmath.isPrime(N)
- N1 = N - 0x1L
- n = 0x1L
- while n < N:
- n = n << 0x1L
- continue
- _fastmath is not None
- n = n >> 0x1L
- for c in sieve[:7]:
- a = long(c)
- d = 0x1L
- t = n
- while t:
- x = d * d % N
- if x == 0x1L and d != 0x1L and d != N1:
- return 0
- t = t >> 0x1L
- continue
- N in sieve if N1 & t else N % i == 0
- if d != 0x1L:
- return 0
-
- return 1
-
- sieve = [
- 2,
- 3,
- 5,
- 7,
- 11,
- 13,
- 17,
- 19,
- 23,
- 29,
- 31,
- 37,
- 41,
- 43,
- 47,
- 53,
- 59,
- 61,
- 67,
- 71,
- 73,
- 79,
- 83,
- 89,
- 97,
- 101,
- 103,
- 107,
- 109,
- 113,
- 127,
- 131,
- 137,
- 139,
- 149,
- 151,
- 157,
- 163,
- 167,
- 173,
- 179,
- 181,
- 191,
- 193,
- 197,
- 199,
- 211,
- 223,
- 227,
- 229,
- 233,
- 239,
- 241,
- 251]
- import struct
-
- def long_to_bytes(n, blocksize = 0):
- s = ''
- n = long(n)
- pack = struct.pack
- while n > 0:
- s = pack('>I', n & 0xFFFFFFFFL) + s
- n = n >> 32
- for i in range(len(s)):
- if s[i] != '\x00':
- break
- continue
- else:
- s = '\x00'
- i = 0
- s = s[i:]
- if blocksize > 0 and len(s) % blocksize:
- s = (blocksize - len(s) % blocksize) * '\x00' + s
-
- return s
-
-
- def bytes_to_long(s):
- acc = 0x0L
- unpack = struct.unpack
- length = len(s)
- if length % 4:
- extra = 4 - length % 4
- s = '\x00' * extra + s
- length = length + extra
-
- for i in range(0, length, 4):
- acc = (acc << 32) + unpack('>I', s[i:i + 4])[0]
-
- return acc
-
- import warnings
-
- def long2str(n, blocksize = 0):
- warnings.warn('long2str() has been replaced by long_to_bytes()')
- return long_to_bytes(n, blocksize)
-
-
- def str2long(s):
- warnings.warn('str2long() has been replaced by bytes_to_long()')
- return bytes_to_long(s)
-
-