a. Thuật toán cộng chính xác bội
- Thuật toán cộng và trừ trên trường hữu hạn được đưa ra dưới dạng các thuật toán tương ứng cho các số nguyên w. Phép gán dạng "(ɛ, z) ← w" được định nghĩa như sau:
- z ← W mod và ε ← 0 nếu w ∈ [0, ), ngược lại ε ← 1.
- Nếu w = x + y + ε' với x, y ∈ [0, ) và ε ∈ {0, 1} , thì w = ε + z và ε được gọi là “bit nhớ” (carry bit) cho phép cộng mỗi một từ đơn (ε = 1 nếu và chỉ nếu z < x + ε' )
VD: Cho a = (0, 11, 173, 248); b = (0, 1, 226, 64), với w = 8, t = 4. Tìm c = a + b mod
a = [0, 11, 173, 248]
b = [0, 1, 226, 64]
W = 8
t = 4
def solve(a, b, W, t):
a.reverse()
b.reverse()
c = []
epsilon = 0
e = pow(2, 8)
for i in range(t):
s = a[i] + b[i] + epsilon
x = s%e
if(s > e): epsilon = 1
else: epsilon = 0
c.append(x)
return [epsilon, c[::-1]]
if __name__ == '__main__':
print(solve(a, b, W, t))
b. Thuật toán trừ chính xác bội
VD: Cho a = (0, 11, 173, 248); b = (0, 1, 226, 64), với w = 8, t = 4. tìm c = a - b mod
a = [0, 11, 173, 248]
b = [0, 1, 226, 64]
W = 8
t = 4
def solve(a, b, W, t):
a.reverse()
b.reverse()
c = []
epsilon = 0
e = pow(2, 8)
for i in range(t):
d = a[i] - b[i] - epsilon
if(d < 0):
d += e
epsilon = 1
else: epsilon = 0
x = d%e
c.append(x)
return epsilon, c[::-1]
if __name__ == '__main__':
print(solve(a, b, W, t))
c. Thuật toán cộng trên
Cho p = 2.147.483.647, W = 8; ta có m = = 31; t = [m/W] = 4. a = (0, 11, 173, 248); b = (0, 1, 226, 64). 3 Tìm c = a + b mod p
import math, re
p = 2147483647
a = [157, 0, 173, 23]
b = [169, 1, 0, 64]
W = 8
m = round(math.log2(p))
t = round(m/W)
def int_to_dec(n):
n = bin(n)[2:].zfill(8*t)
b = re.findall('\d{8}', n)
c = ['0b' + i for i in b]
return [int(i, 2) for i in c]
def dec_to_int(n):
n = ''.join([bin(i)[2:].zfill(8) for i in n])
return int(n, 2)
def multiprecision_addition(a, b, W, t):
a.reverse()
b.reverse()
c = []
epsilon = 0
e = pow(2, 8)
for i in range(t):
s = a[i] + b[i] + epsilon
x = s%e
if(s > e): epsilon = 1
else: epsilon = 0
c.append(x)
return [epsilon, c[::-1]]
def multiprecision_subtraction(a, b, W, t):
a.reverse()
b.reverse()
c = []
epsilon = 0
e = pow(2, 8)
for i in range(t):
d = a[i] - b[i] - epsilon
if(d < 0):
d += e
epsilon = 1
else: epsilon = 0
x = d%e
c.append(x)
return epsilon, c[::-1]
if __name__ == '__main__':
[epsilon, c] = multiprecision_addition(a, b, W, t)
p = int_to_dec(p)
if epsilon == 1:
d = multiprecision_subtraction(c, p, W, t)
elif epsilon == 0:
d = multiprecision_subtraction(p, c, W, t)
print(d)
d. Thuật toán trừ trên
Cho p = 2.147.483.647, W = 8; ta có m = = 31; t = [m/W] = 4. a = (0, 11, 173, 248); b = (0, 1, 226, 64). 3 Tìm c = a - b mod p
import math, re
p = 2147483647
a = [0, 11, 173, 248]
b = [0, 1, 226, 64]
W = 8
m = round(math.log2(p))
t = round(m/W)
def int_to_dec(n):
n = bin(n)[2:].zfill(8*t)
b = re.findall('\d{8}', n)
c = ['0b' + i for i in b]
return [int(i, 2) for i in c]
def dec_to_int(n):
n = ''.join([bin(i)[2:].zfill(8) for i in n])
return int(n, 2)
def multiprecision_addition(a, b, W, t):
a.reverse()
b.reverse()
c = []
epsilon = 0
e = pow(2, 8)
for i in range(t):
s = a[i] + b[i] + epsilon
x = s%e
if(s > e): epsilon = 1
else: epsilon = 0
c.append(x)
return [epsilon, c[::-1]]
def multiprecision_subtraction(a, b, W, t):
a.reverse()
b.reverse()
c = []
epsilon = 0
e = pow(2, 8)
for i in range(t):
d = a[i] - b[i] - epsilon
if(d < 0):
d += e
epsilon = 1
else: epsilon = 0
x = d%e
c.append(x)
return epsilon, c[::-1]
if __name__ == '__main__':
[epsilon, c] = multiprecision_subtraction(a, b, W, t)
p = int_to_dec(p)
if epsilon == 1:
d = multiprecision_addition(c, p, W, t)
elif epsilon == 0:
d = c
print(d)
Còn tiếp...