-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbigmath.py
90 lines (71 loc) · 1.88 KB
/
bigmath.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# bigmath.py
# created by Kaiwen Xu
#
# module for calculating very large numbers
import integer
def numToDigitArray(num):
"""Return an array of int which represent the number by digit.
Arguments:
num -- input number
"""
if integer.isInt(num):
digitArray = []
strArray = str(num)
for s in strArray:
digitArray.append(int(s))
return digitArray
else:
raise ValueError("Number must be integer.")
def numToShortDigitArray(num, digitArray):
"""Parse number into provided digitArray. If the length of digitArray is
smaller than the length of num, then only last fitable digits will be
filled into the array.
Arguments:
num -- input number
digitArray -- digit array that needed to be filled
"""
if integer.isInt(num):
strArray = str(num)
rStrArray = strArray[::-1]
numLength = len(strArray)
digitLength = len(digitArray)
for i in xrange(0, numLength):
if i < digitLength:
digitArray[digitLength - i - 1] = int(rStrArray[i])
else:
raise ValueError("Number must be integer.")
def digitArrayToNum(digitArray):
"""Return the number which the digitArray represents.
Arguments:
digitArray -- array of digits
"""
num = 0
length = len(digitArray)
power = length - 1
for d in digitArray:
if d > 9 or d < 0:
raise ValueError("Digits must be 0, 1, ... , 9.")
else:
num += d * pow(10, power)
power -= 1
return num
def bigpow(x, y):
"""Return x ^ y.
"""
total = 1
for c in xrange(0, y):
total *= x
return total
def digFromFractGenerator(numerator, denominator):
"""Return a generator of digits from a fraction, only digits after decimal
point are generated.
Arguments:
numerator -- numerator of fraction
denominator -- denominator of fraction
"""
if numerator > denominator:
numerator = numerator % denominator
while numerator != 0:
numerator = numerator * 10
yield int(numerator / denominator)
numerator = numerator % denominator