2.5 Horner’s Rule and Binary Exponentiation
2.5.2 Hệ số mũ nhị phân (Binary Exponentiatio)
Để tính x25 thì ta cần nhân với chính nó 24 lần. Nhưng nếu x lớn (giả sử một triệu chữ số) thì làm điều đó sẽ rất mất thời gian.
Luỹ thừa nhị phân là một thủ thuật cho phép tính tốn an chỉ với độ phức tạp là O(logn) thay vì phải nhân n lần.
Đặt: n=bI… b … bi 0 . Là dạng biểu diễn số nguyên n dưới dạng nhị phân. Ví dụ: số mũ là 13: 13 1101= 2=1×23+1×22+0×21+1×20 .
Chúng ta có cơng thức p(2)=bI2I+…+bi2i+…+b0 .
Vậy công thức của an khi khai triển số mũ ra nhị phân ta được:
an=ap(2)=abI2I
+…+bi2i
+…+b0 .
Để tính tốn luỹ thừa chúng ta có 2 thuật tốn: LeftRightBinaryExponentiation và RightLeftBinaryExponentiation.
Ở đây chung ta chỉ đi qua thuật toán LeftRightBinaryExponentiation. Thuật tốn LeftRightBinaryExponentiation nói rằng khi chữ số nhị phân tại vị trí đang xét là 1 thì ln bình phương giá trị trước đó và nhân với a.
a2p+bi=a2p . abi=(ap )2 . abi={ (ap)2 ,∧if bi=0 (ap )2 . a ,∧if bi=1
Thuật toán LeftRightBinaryExponentiation (a b(n)), Đầu vào: Một số a và danh sách b(n) số nhị phân b , …, b .I 0 Đầu ra: Giá trị a .n
product ← a
for i ← I − 1 downto 0 do
product ← product product∗
if b = 1: product ← product ai ∗
return product
Ví dụ: Tính a theo thuật toán LeftRightBinaryExponentiation. Với13 n=13=11012.
Bảng 2. 2 Ví dụ tính theo thuật tốn LeftRightBinaryExponentiation
Ta có thể chứng minh được độ phức tạp của thuật toán này là log2n . Nó tối ưu hơn với phép tính luỹ thừa ln u cầu n-1 phép nhân.