Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #! /usr/local/bin/python3.6
- """
- Multiplication of big-digit values
- """
- import random
- import sys
- class MultiplyNormal:
- D_MAX = 1024 # Maximum number of digits (power of 2)
- D = 1024 # Digits of computation (Multiples of 4 <= D_MAX)
- def __init__(self):
- self.a = [random.randrange(10) for _ in range(self.D)]
- self.b = [random.randrange(10) for _ in range(self.D)]
- def compute(self):
- """
- Computation of multiplication
- """
- try:
- for i in range(self.D_MAX - len(self.a)):
- self.a.append(0)
- for i in range(self.D_MAX - len(self.b)):
- self.b.append(0)
- z = self.__multiply_normal(self.a, self.b)
- z = self.__do_carry(z)
- self.__display(self.a, self.b, z);
- except Exception as e:
- raise
- def __multiply_normal(self, a, b):
- """
- Normal multiplication
- """
- try:
- a_len, b_len = len(a), len(b)
- z = [0 for _ in range(a_len + b_len)]
- for j in range(b_len):
- for i in range(a_len):
- z[j + i] += a[i] * b[j]
- return z
- except Exception as e:
- raise
- def __do_carry(self, a):
- """
- Process of carrying
- """
- cr = 0
- try:
- for i in range(len(a)):
- a[i] += cr
- cr = int(a[i] / 10)
- a[i] -= cr * 10
- if cr != 0:
- print("[ OVERFLOW!! ] ", cr)
- return a
- except Exception as e:
- raise
- def __display(self, a, b, z):
- """
- Display
- """
- a_len, b_len, z_len = self.D_MAX, self.D_MAX, self.D_MAX * 2
- try:
- while a[a_len - 1] == 0:
- if a[a_len - 1] == 0:
- a_len -= 1
- while b[b_len - 1] == 0:
- if b[b_len - 1] == 0:
- b_len -= 1
- while z[z_len - 1] == 0:
- if z[z_len - 1] == 0:
- z_len -= 1
- print("a =")
- for i in range(a_len - 1, -1, -1):
- print(a[i], end="")
- if (a_len - i) % 10 == 0:
- print(" ", end="")
- if (a_len - i) % 50 == 0:
- print()
- print()
- print("b =")
- for i in range(b_len - 1, -1, -1):
- print(b[i], end="")
- if (b_len - i) % 10 == 0:
- print(" ", end="")
- if (b_len - i) % 50 == 0:
- print()
- print()
- print("z =")
- for i in range(z_len - 1, -1, -1):
- print(z[i], end="")
- if (z_len - i) % 10 == 0:
- print(" ", end="")
- if (z_len - i) % 50 == 0:
- print()
- print()
- except Exception as e:
- raise
- if __name__ == '__main__':
- try:
- obj = MultiplyNormal()
- obj.compute()
- except Exception as e:
- print("EXCEPTION!", e.args, file=sys.stderr)
- sys.exit(1)
Add Comment
Please, Sign In to add comment