Quay trở lại vấn đề đặt ra ban đầu, muốn tận dụng được khả năng tính toán song song trên nhiều máy tính, điều quan trọng nhất là tìm được thuật toán thích hợp. Nhiều khi sự phụ thuộc tính toán “giá trị sau được tính dựa vào giá trị trước
- 16 -
đó” có vẻ rất “bền”, nhưng ta vẫn “tách” nó ra để chia cho nhiều máy cùng thực hiện. Sau đây là một ví dụ minh họa:
Xét bài toán sau: Cho biết a0 và αk, βk với k =1,2,3...,n; trong đó n = 2m. Tính
an = αnan-1+ βn (1) với giả thiết số bộ xử lý không giới hạn.
Việc giá trị an phải tính toán qua an−1 khiến chúng ta có cảm giác là việc tìm ra giá trị an nhất định phải thực hiện tuần tự qua n bước. Tức là phải mất đúng n = 2m
bước tính, cho dù ta có thể huy động rất nhiều máy cùng tính đi chăng nữa. Tuy nhiên sự việc lại không hẳn như vậy, ta chỉ cần có m bước tính mà thôi. Để thấy được điều này chúng ta thực hiện phép biến đổi sau:
an = αn (αn-1an-2 + βn-1) + βn = αn αn-1an-2 + αn βn-1 + βn
Đặt: λn = αn βn-1 + βn , chỉ với một bước để tính được giá trị λn (n = 1,2,3,..). Khi đó: an = αn αn-1an-2 + λn (2).
Từ công thức (2), cho thấy chỉ cần biết giá trị a0 là chúng ta có thể tính được tất cả các giá trị: a2, a4, a8, …, a m
2 , và như vậy chỉ thêm một bước tính nữa (sử dụng nhiều máy tính) là tính được tất cả các giá trị với số lẻ. Cụ thể:
Từ (1) suy ra: a2n+1 = α2n+1a2n + β2n+1 .
Ký hiệu Tm là số bước cần để tính ra giá trị cả 2m giá trị: a1 , a2, a3,…, a m
2 .Chỉ với một bước tính là biết được tất cả các giá trị λn (bằng cách tính các λn trên nhiều máy). Như vậy, ta có:
Tm = 2 + Tm-1. ( qua 2 bước tính a m
2 và a2m−1 ).
Từ đây suy ra: Tm = 2m. Từ đây kết luận, chúng ta không cần 2m bước tính, mà chỉ dùng 2m bước tính.