Skip to content

Instantly share code, notes, and snippets.

@vilterp
Created July 11, 2009 00:27
Show Gist options
  • Save vilterp/144934 to your computer and use it in GitHub Desktop.
Save vilterp/144934 to your computer and use it in GitHub Desktop.
CHARS = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
MAX_RADIX = len(CHARS)
class Bignum:
def __init__(self, digits, radix=10):
# set self.radix
if radix < MAX_RADIX:
self.radix = radix
else:
raise Exception("the radix can't be bigger than %d" % MAX_RADIX)
# used for clone()
if isinstance(digits,Bignum):
self.digits = digits.digits
self.radix = digits.radix
return
# set self.digits
if isinstance(digits,int):
self.init_from_base_10(digits)
return
if isinstance(digits,str) or isinstance(digits,list):
self.digits = []
# reversed so digits can be added O(1)
for digit in reversed(digits):
pos = CHARS.find(digit)
if pos < radix:
self.digits.append(pos)
else:
raise Exception('%s (%d) is >= radix (%d)' % (digit,pos,self.radix))
else:
raise Exception('digits must be an integer, string or list of strings')
def init_from_base_10(self, val):
self.digits = [0]
self.__add__(val)
def __repr__(self):
return ''.join([str(d) for d in reversed(self.digits)])
def clone(self):
return Bignum(self)
def __int__(self):
return self.to_base_ten()
def to_base_ten(self):
ans = 0
for i in xrange(0,len(self.digits)):
ans += self.digits[i] * self.radix ** i
return ans
def __add__(self, other):
result = self.clone()
if isinstance(other,Bignum): # should return Bignum
other = other.to_base_ten()
if isinstance(other,int):
result.digits[0] += other
result.carry(0)
return result
else:
raise Exception('can only add an int or another Bignum to a Bignum')
def carry(self, ind, overflow=None):
overflowed = self.digits[ind]
if overflow is None:
overflow = self.digits[ind] - self.radix
if overflow >= 0:
self.digits[ind] = overflow % self.radix
nextind = ind+1
if nextind == len(self.digits):
newdigit = overflowed / self.radix
self.digits.append(newdigit)
if newdigit >= self.radix:
self.carry(nextind,newdigit)
else:
self.digits[nextind] += overflowed / self.radix
self.carry(nextind)
def ascii2bin(string):
ans = []
for char in string:
b = Bignum(ord(char),2)
rep = str(b)
zeroes = '0' * (8-len(rep))
ans.append(zeroes + rep)
return ''.join(ans)
def bin2ascii(bin):
ans = []
for i in range(0,len(bin)/8):
rep = bin[i*8:i*8+8]
first_one_ind = rep.find('1')
b = Bignum(rep[first_one_ind:],2)
ans.append(chr(b.to_base_ten()))
return ''.join(ans)
if __name__ == '__main__':
x = Bignum(0,2)
for i in range(0,50):
print(x)
x += 1
01000011010010000100000101010010010100110010000000111101001000000010011100110000001100010011001000110011001101000011010100110110001101110011100000111001011000010110001001100011011001000110010101100110011001110110100001101001011010100110101101101100011011010110111001101111011100000111000101110010011100110111010001110101011101100111011101111000011110010111101001000001010000100100001101000100010001010100011001000111010010000100100101001010010010110100110001001101010011100100111101010000010100010101001001010011010101000101010101010110010101110101100001011001010110100010011100001010010011010100000101011000010111110101001001000001010001000100100101011000001000000011110100100000011011000110010101101110001010000100001101001000010000010101001001010011001010010000101000001010011000110110110001100001011100110111001100100000010000100110100101100111011011100111010101101101001110100000101000100000001000000000101000100000001000000110010001100101011001100010000001011111010111110110100101101110011010010111010001011111010111110010100001110011011001010110110001100110001011000010000001100100011010010110011101101001011101000111001100101100001000000111001001100001011001000110100101111000001111010011000100110000001010010011101000001010001000000010000000100000001000000010001100100000011100110110010101110100001000000111001101100101011011000110011000101110011100100110000101100100011010010111100000100000001000000010000000100000000010100010000000100000001000000010000001101001011001100010000001110010011000010110010001101001011110000010000000111100001000000100110101000001010110000101111101010010010000010100010001001001010110000011101000001010001000000010000000100000001000000010000000100000011100110110010101101100011001100010111001110010011000010110010001101001011110000010000000111101001000000111001001100001011001000110100101111000000010100010000000100000001000000010000001100101011011000111001101100101001110100000101000100000001000000010000000100000001000000010000001110010011000010110100101110011011001010010000001000101011110000110001101100101011100000111010001101001011011110110111000101000001000100111010001101000011001010010000001110010011000010110010001101001011110000010000001100011011000010110111000100111011101000010000001100010011001010010000001100010011010010110011101100111011001010111001000100000011101000110100001100001011011100010000000100101011001000010001000100000001001010010000001001101010000010101100001011111010100100100000101000100010010010101100000101001000010100010000000100000001000000010000000100011001000000111010101110011011001010110010000100000011001100110111101110010001000000110001101101100011011110110111001100101001010000010100100001010001000000010000000100000001000000110100101100110001000000110100101110011011010010110111001110011011101000110000101101110011000110110010100101000011001000110100101100111011010010111010001110011001011000100001001101001011001110110111001110101011011010010100100111010000010100010000000100000001000000010000000100000001000000111001101100101011011000110011000101110011001000110100101100111011010010111010001110011001000000011110100100000011001000110100101100111011010010111010001110011001011100110010001101001011001110110100101110100011100110000101000100000001000000010000000100000001000000010000001110011011001010110110001100110001011100111001001100001011001000110100101111000001000000011110100100000011001000110100101100111011010010111010001110011001011100111001001100001011001000110100101111000000010100010000000100000001000000010000000100000001000000111001001100101011101000111010101110010011011100000101000100000001000000010000000100000001000110010000001110011011001010111010000100000011100110110010101101100011001100010111001100100011010010110011101101001011101000111001100001010001000000010000000100000001000000110100101100110001000000110100101110011011010010110111001110011011101000110000101101110011000110110010100101000011001000110100101100111011010010111010001110011001011000110100101101110011101000010100100111010000010100010000000100000001000000010000000100000001000000111001101100101011011000110011000101110011010010110111001101001011101000101111101100110011100100110111101101101010111110110001001100001011100110110010101011111001100010011000000101000011001000110100101100111011010010111010001110011001010010000101000100000001000000010000000100000001000000010000001110010011001010111010001110101011100100110111000001010001000000010000000100000001000000110100101100110001000000110100101110011011010010110111001110011011101000110000101101110011000110110010100101000011001000110100101100111011010010111010001110011001011000111001101110100011100100010100100100000011011110111001000100000011010010111001101101001011011100111001101110100011000010110111001100011011001010010100001100100011010010110011101101001011101000111001100101100011011000110100101110011011101000010100100111010000010100010000000100000001000000010000000100000001000000111001101100101011011000110011000101110011001000110100101100111011010010111010001110011001000000011110100100000010110110101110100001010001000000010000000100000001000000010000000100000001000110010000001110010011001010111011001100101011100100111001101100101011001000010000001110011011011110010000001100100011010010110011101101001011101000111001100100000011000110110000101101110001000000110001001100101001000000110000101100100011001000110010101100100001000000100111100101000001100010010100100001010001000000010000000100000001000000010000000100000011001100110111101110010001000000110010001101001011001110110100101110100001000000110100101101110001000000111001001100101011101100110010101110010011100110110010101100100001010000110010001101001011001110110100101110100011100110010100100111010000010100010000000100000001000000010000000100000001000000010000000100000011100000110111101110011001000000011110100100000010000110100100001000001010100100101001100101110011001100110100101101110011001000010100001100100011010010110011101101001011101000010100100001010001000000010000000100000001000000010000000100000001000000010000001101001011001100010000001110000011011110111001100100000001111000010000001110010011000010110010001101001011110000011101000001010001000000010000000100000001000000010000000100000001000000010000000100000001000000111001101100101011011000110011000101110011001000110100101100111011010010111010001110011001011100110000101110000011100000110010101101110011001000010100001110000011011110111001100101001000010100010000000100000001000000010000000100000001000000010000000100000011001010110110001110011011001010011101000001010001000000010000000100000001000000010000000100000001000000010000000100000001000000111001001100001011010010111001101100101001000000100010101111000011000110110010101110000011101000110100101101111011011100010100000100111001001010111001100100000001010000010010101100100001010010010000001101001011100110010000000111110001111010010000001110010011000010110010001101001011110000010000000101000001001010110010000101001001001110010000000100101001000000010100001100100011010010110011101101001011101000010110001110000011011110111001100101100011100110110010101101100011001100010111001110010011000010110010001101001011110000010100100101001000010100010000000100000001000000010000001100101011011000111001101100101001110100000101000100000001000000010000000100000001000000010000001110010011000010110100101110011011001010010000001000101011110000110001101100101011100000111010001101001011011110110111000101000001001110110010001101001011001110110100101110100011100110010000001101101011101010111001101110100001000000110001001100101001000000110000101101110001000000110100101101110011101000110010101100111011001010111001000101100001000000111001101110100011100100110100101101110011001110010000001101111011100100010000001101100011010010111001101110100001000000110111101100110001000000111001101110100011100100110100101101110011001110111001100100111001010010000101000100000001000000000101000100000001000000110010001100101011001100010000001101001011011100110100101110100010111110110011001110010011011110110110101011111011000100110000101110011011001010101111100110001001100000010100001110011011001010110110001100110001011000010000001110110011000010110110000101001001110100000101000100000001000000010000000100000011100110110010101101100011001100010111001100100011010010110011101101001011101000111001100100000001111010010000001011011001100000101110100001010001000000010000000100000001000000111001101100101011011000110011000101110010111110101111101100001011001000110010001011111010111110010100001110110011000010110110000101001000010100010000000100000000010100010000000100000011001000110010101100110001000000101111101011111011100100110010101110000011100100101111101011111001010000111001101100101011011000110011000101001001110100000101000100000001000000010000000100000011100100110010101110100011101010111001001101110001000000010011100100111001011100110101001101111011010010110111000101000010110110111001101110100011100100010100001100100001010010010000001100110011011110111001000100000011001000010000001101001011011100010000001110010011001010111011001100101011100100111001101100101011001000010100001110011011001010110110001100110001011100110010001101001011001110110100101110100011100110010100101011101001010010000101000100000001000000000101000100000001000000110010001100101011001100010000001100011011011000110111101101110011001010010100001110011011001010110110001100110001010010011101000001010001000000010000000100000001000000111001001100101011101000111010101110010011011100010000001000010011010010110011101101110011101010110110100101000011100110110010101101100011001100010100100001010001000000010000000001010001000000010000001100100011001010110011000100000010111110101111101101001011011100111010001011111010111110010100001110011011001010110110001100110001010010011101000001010001000000010000000100000001000000111001001100101011101000111010101110010011011100010000001110011011001010110110001100110001011100111010001101111010111110110001001100001011100110110010101011111011101000110010101101110001010000010100100001010001000000010000000001010001000000010000001100100011001010110011000100000011101000110111101011111011000100110000101110011011001010101111101110100011001010110111000101000011100110110010101101100011001100010100100111010000010100010000000100000001000000010000001100001011011100111001100100000001111010010000000110000000010100010000000100000001000000010000001100110011011110111001000100000011010010010000001101001011011100010000001111000011100100110000101101110011001110110010100101000001100000010110001101100011001010110111000101000011100110110010101101100011001100010111001100100011010010110011101101001011101000111001100101001001010010011101000001010001000000010000000100000001000000010000000100000011000010110111001110011001000000010101100111101001000000111001101100101011011000110011000101110011001000110100101100111011010010111010001110011010110110110100101011101001000000010101000100000011100110110010101101100011001100010111001110010011000010110010001101001011110000010000000101010001010100010000001101001000010100010000000100000001000000010000001110010011001010111010001110101011100100110111000100000011000010110111001110011000010100010000000100000000010100010000000100000011001000110010101100110001000000101111101011111011000010110010001100100010111110101111100101000011100110110010101101100011001100010110000100000011011110111010001101000011001010111001000101001001110100000101000100000001000000010000000100000011100100110010101110011011101010110110001110100001000000011110100100000011100110110010101101100011001100010111001100011011011000110111101101110011001010010100000101001000010100010000000100000001000000010000001101001011001100010000001101001011100110110100101101110011100110111010001100001011011100110001101100101001010000110111101110100011010000110010101110010001011000100001001101001011001110110111001110101011011010010100100111010000010100010000000100000001000000010000000100000001000000110111101110100011010000110010101110010001000000011110100100000011011110111010001101000011001010111001000101110011101000110111101011111011000100110000101110011011001010101111101110100011001010110111000101000001010010010000000100011001000000110111001101111011101000010000001101111011100000111010001101001011011010110000101101100001011100010111000101110000010100010000000100000001000000010000001101001011001100010000001101001011100110110100101101110011100110111010001100001011011100110001101100101001010000110111101110100011010000110010101110010001011000110100101101110011101000010100100111010000010100010000000100000001000000010000000100000001000000111001001100101011100110111010101101100011101000010111001100100011010010110011101101001011101000111001101011011001100000101110100100000001010110011110100100000011011110111010001101000011001010111001000001010001000000010000000100000001000000010000000100000011100100110010101110011011101010110110001110100001011100110001101100001011100100111001001111001001010000011000000101001000010100010000000100000001000000010000000100000001000000111001001100101011101000111010101110010011011100010000001110010011001010111001101110101011011000111010000001010001000000010000000100000001000000110010101101100011100110110010100111010000010100010000000100000001000000010000000100000001000000111001001100001011010010111001101100101001000000100010101111000011000110110010101110000011101000110100101101111011011100010100000100111011000110110000101101110001000000110111101101110011011000111100100100000011000010110010001100100001000000110000101101110001000000110100101101110011101000010000001101111011100100010000001100001011011100110111101110100011010000110010101110010001000000100001001101001011001110110111001110101011011010010000001110100011011110010000001100001001000000100001001101001011001110110111001110101011011010010011100101001000010100010000000100000000010100010000000100000011001000110010101100110001000000110001101100001011100100111001001111001001010000111001101100101011011000110011000101100001000000110100101101110011001000010110000100000011011110111011001100101011100100110011001101100011011110111011100111101010011100110111101101110011001010010100100111010000010100010000000100000001000000010000001101111011101100110010101110010011001100110110001101111011101110110010101100100001000000011110100100000011100110110010101101100011001100010111001100100011010010110011101101001011101000111001101011011011010010110111001100100010111010000101000100000001000000010000000100000011010010110011000100000011011110111011001100101011100100110011001101100011011110111011100100000011010010111001100100000010011100110111101101110011001010011101000001010001000000010000000100000001000000010000000100000011011110111011001100101011100100110011001101100011011110111011100100000001111010010000001110011011001010110110001100110001011100110010001101001011001110110100101110100011100110101101101101001011011100110010001011101001000000010110100100000011100110110010101101100011001100010111001110010011000010110010001101001011110000000101000100000001000000010000000100000011010010110011000100000011011110111011001100101011100100110011001101100011011110111011100100000001111100011110100100000001100000011101000001010001000000010000000100000001000000010000000100000011100110110010101101100011001100010111001100100011010010110011101101001011101000111001101011011011010010110111001100100010111010010000000111101001000000110111101110110011001010111001001100110011011000110111101110111001000000010010100100000011100110110010101101100011001100010111001110010011000010110010001101001011110000000101000100000001000000010000000100000001000000010000001101110011001010111100001110100011010010110111001100100001000000011110100100000011010010110111001100100001010110011000100001010001000000010000000100000001000000010000000100000011010010110011000100000011011100110010101111000011101000110100101101110011001000010000000111101001111010010000001101100011001010110111000101000011100110110010101101100011001100010111001100100011010010110011101101001011101000111001100101001001110100000101000100000001000000010000000100000001000000010000000100000001000000110111001100101011101110110010001101001011001110110100101110100001000000011110100100000011011110111011001100101011100100110011001101100011011110111011101100101011001000010000000101111001000000111001101100101011011000110011000101110011100100110000101100100011010010111100000001010001000000010000000100000001000000010000000100000001000000010000001110011011001010110110001100110001011100110010001101001011001110110100101110100011100110010111001100001011100000111000001100101011011100110010000101000011011100110010101110111011001000110100101100111011010010111010000101001000010100010000000100000001000000010000000100000001000000010000000100000011010010110011000100000011011100110010101110111011001000110100101100111011010010111010000100000001111100011110100100000011100110110010101101100011001100010111001110010011000010110010001101001011110000011101000001010001000000010000000100000001000000010000000100000001000000010000000100000001000000111001101100101011011000110011000101110011000110110000101110010011100100111100100101000011011100110010101111000011101000110100101101110011001000010110001101110011001010111011101100100011010010110011101101001011101000010100100001010001000000010000000100000001000000010000000100000011001010110110001110011011001010011101000001010001000000010000000100000001000000010000000100000001000000010000001110011011001010110110001100110001011100110010001101001011001110110100101110100011100110101101101101110011001010111100001110100011010010110111001100100010111010010000000101011001111010010000001101111011101100110010101110010011001100110110001101111011101110110010101100100001000000010111100100000011100110110010101101100011001100010111001110010011000010110010001101001011110000000101000100000001000000010000000100000001000000010000000100000001000000111001101100101011011000110011000101110011000110110000101110010011100100111100100101000011011100110010101111000011101000110100101101110011001000010100100001010001000000010000000001010000010100110010001100101011001100010000001100001011100110110001101101001011010010011001001100010011010010110111000101000011100110111010001110010011010010110111001100111001010010011101000001010001000000010000001100001011011100111001100100000001111010010000001011011010111010000101000100000001000000110011001101111011100100010000001100011011010000110000101110010001000000110100101101110001000000111001101110100011100100110100101101110011001110011101000001010001000000010000000100000001000000110001000100000001111010010000001000010011010010110011101101110011101010110110100101000011011110111001001100100001010000110001101101000011000010111001000101001001011000011001000101001000010100010000000100000001000000010000001110010011001010111000000100000001111010010000001110011011101000111001000101000011000100010100100001010001000000010000000100000001000000111101001100101011100100110111101100101011100110010000000111101001000000010011100110000001001110010000000101010001000000010100000111000001011010110110001100101011011100010100001110010011001010111000000101001001010010000101000100000001000000010000000100000011000010110111001110011001011100110000101110000011100000110010101101110011001000010100001111010011001010111001001101111011001010111001100100000001010110010000001110010011001010111000000101001000010100010000000100000011100100110010101110100011101010111001001101110001000000010011100100111001011100110101001101111011010010110111000101000011000010110111001110011001010010000101000001010011001000110010101100110001000000110001001101001011011100011001001100001011100110110001101101001011010010010100001100010011010010110111000101001001110100000101000100000001000000110000101101110011100110010000000111101001000000101101101011101000010100010000000100000011001100110111101110010001000000110100100100000011010010110111000100000011100100110000101101110011001110110010100101000001100000010110001101100011001010110111000101000011000100110100101101110001010010010111100111000001010010011101000001010001000000010000000100000001000000111001001100101011100000010000000111101001000000110001001101001011011100101101101101001001010100011100000111010011010010010101000111000001010110011100001011101000010100010000000100000001000000010000001100110011010010111001001110011011101000101111101101111011011100110010101011111011010010110111001100100001000000011110100100000011100100110010101110000001011100110011001101001011011100110010000101000001001110011000100100111001010010000101000100000001000000010000000100000011000100010000000111101001000000100001001101001011001110110111001110101011011010010100001110010011001010111000001011011011001100110100101110010011100110111010001011111011011110110111001100101010111110110100101101110011001000011101001011101001011000011001000101001000010100010000000100000001000000010000001100001011011100111001100101110011000010111000001110000011001010110111001100100001010000110001101101000011100100010100001100010001011100111010001101111010111110110001001100001011100110110010101011111011101000110010101101110001010000010100100101001001010010000101000100000001000000111001001100101011101000111010101110010011011100010000000100111001001110010111001101010011011110110100101101110001010000110000101101110011100110010100100001010000010100110100101100110001000000101111101011111011011100110000101101101011001010101111101011111001000000011110100111101001000000010011101011111010111110110110101100001011010010110111001011111010111110010011100111010000010100010000000100000011100000111001001101001011011100111010000100000011000010111001101100011011010010110100100110010011000100110100101101110001010000110111101110000011001010110111000101000001001110110001001101001011001110110111001110101011011010010111001110000011110010010011100101001001011100111001001100101011000010110010000101000001010010010100100001010
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment