8. Bố cục của luận án
2.4.2. Giải pháp để xây dựng dãy phân rã một cách hiệu quả
Theo đúng các bước của phương pháp phân rã, ta cần tính tốn T trạng thái trong của m-dãy để tạo ra 1 bit của dãy phân rã đầu ra.
Nếu ta sử dụng biến đổi - d để tính trạng thái mới (hoặc phương pháp Gaussian), thay vì tính tốn từng trạng thái bằng cách nhân trạng thái trong hiện tại với d trong mỗi bước trên trường GF(qn), ta có thể tính trực tiếp trạng thái bên trong sau bước T bằng trạng thái bên trong hiện tại nhân với dT trên trường GF(qn). Ta sẽ không cần phải lưu trạng thái trong của T-1 bước trung gian. Tuy nhiên trong quá trình tính tốn đa thức trên trường GF(qn) cần tính phép modulo đa thức với T hệ số. Q trình tính tốn này sẽ cần nhiều thời gian, đặc biệt khi giá trị T rất lớn.
Khi ta sử dụng phương pháp Fibonacci (là cách phổ biến để sinh m-dãy trong các vi xử lý), ta có thể thực hiện việc phân rã nhanh hơn bằng cách thực hiện các tính tốn trước theo phương pháp sau:
Giả sử trạng thái trong của m-dãy được lưu trong một thanh ghi dịch ký hiệu {ai} (i = 0..n-1).
Công thức sinh bit phản hồi cho m-dãy theo Fibonacci như sau:
𝑎𝑛 = ∑𝑛−1𝑖=0 𝑎𝑖 ∙ 𝑓𝑛−𝑖 . (2.39) Ví dụ 2.4: ta lấy lại tham số trong thử nghiệm trên với bước phân rã được chọn là T = 5. Ta biết rằng đa thức sinh của dãy phân rã là :
g1(x) = x23 + x22 + x18 + x17 + x16 + x15 + x12 + x10 + x7 + x6 + x5 + x3 + x2 + x + 1. Từ các bit của trạng thái ban đầu S(0) = {a0, a1, …, a22}, sử dụng phương
pháp Fibonacci để lập công thức cho cả T bit liên tiếp, tính theo tham số là n bit đầu vào như sau (sử dụng đa thức sinh của dãy ban đầu):
a24 = a1 ^ a6 ^ a9 ^ a10 ^ a13 ^ a15 ^ a19 ^ a22 . a25 = a2 ^ a7 ^ a10 ^ a11 ^ a14 ^ a16 ^ a20 ^ a23 .
= a2 ^ a7 ^ a10 ^ a11 ^ a14 ^ a16 ^ a20 ^ a0 ^ a5 ^ a8 ^ a9 ^ a12 ^ a14 ^ a18 ^ a21 = a0 ^ a2 ^ a5 ^ a7 ^ a8 ^ a9 ^ a10 ^ a11 ^ a12 ^ a16 ^ a18 ^ a20 ^ a21 .
a26 = a3 ^ a8 ^ a11 ^ a12 ^ a15 ^ a17 ^ a21 ^ a24
= a1 ^ a3 ^ a6 ^ a8 ^ a9 ^ a10 ^ a11 ^ a12 ^ a13 ^ a17 ^ a19 ^ a21 ^ a22 .
a27 = a4 ^ a9 ^ a12 ^ a13 ^ a16 ^ a18 ^ a22 ^ a25
= a0 ^ a2 ^ a4 ^ a5 ^ a7 ^ a8 ^ a10 ^ a11 ^ a13 ^ a20 ^ a21 ^ a22 .
Như vậy trạng thái trong của thanh ghi sau T bước sẽ là:
S(5) = {a5, a6, … , a22, a23, a24, a25, a26, a27} . (2.40) Biểu diễn các hệ số dưới dạng ma trận như sau:
A = [ 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ⋮ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1] (2.41)
Với biểu diễn ma trận này, ta có thể tính trạng thái trong của thanh ghi sau T bước:
S(T) = A S(0)T . (2.42)
Sử dụng lặp lại cơng thức (2.42), ta có thể sinh ra tồn bộ dãy phân rã mà khơng cần tính các giá trị trung gian.
Chú ý là ta cần có được tồn bộ các giá trị các bit của trạng thái trong tại S(5) vì để tính giá trị bit a32 (bit tiếp theo trong quá trình phân rã dãy ban đầu) ra cần
toàn bộ các giá trị các bit của trạng thái trong tại S(5) để áp dụng cho (2.42). Tuy rằng ta có thể xây dựng cơng thức tính trực tiếp a32 từ S(0), nhưng ta khơng thể tính trước tồn bộ các công thức sinh cho từng bit của dãy phân rã.
Với T < m, ta có thể tính được các bit của dãy phân rã mà chỉ cần lưu T công thức trong (2.41), không cần thiết lưu toàn bộ ma trận A trong (2.42). Giải pháp này chỉ cần lưu trữ thơng tin ít hơn, và hiệu năng sẽ tốt hơn so với phép nhân ma trận đầy đủ sử dụng (2.42).
Trong các thử nghiệm thực tế, nếu áp dụng giải pháp nêu trên, độ phức tạp tính tốn khơng thay đổi giữa phương pháp truyền thống (tính trực tiếp theo (2.40)) và phương pháp sử dụng (2.41). Tuy nhiên trong phương pháp truyền thống, ta cần dịch chuyển thanh ghi dịch T lần, mỗi lần dịch chuyển 1 vị trí. Với phương pháp sử dụng (2.41) và (2.42) ta chỉ cần một lần dịch chuyển thanh ghi.