Trang 7 trên tổng số 7 Đầu tiênĐầu tiên ... 567
Từ 61 tới 70 trên tổng số 70 kết quả

Đề tài: một phương pháp mã hóa tiếng Việt

  1. #61
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Mặc định một phương pháp mã hóa tiếng Việt

    Chỉ riêng tháng 9/2021 này, mình đã ra liên tiếp 3 phiên bản của mã C*. Nếu như phiên bản đầu [#58] có thể gọi là "bá đạo" thì phiên bản hai [#59] phải gọi là "vương đạo" và phiên bản ba [#60] là "đế đạo". Vì càng mới càng đẹp, có trật tự hơn, khoa học hơn.

    Tuy nhiên, cái "đạo" ấy càng cao thì càng khó dùng. Ý tưởng "mỗi bit đều phải có một nội hàm", tuy đẹp, nhưng chỉ là lý tưởng. Là cái mà ta tưởng là có . Đơn giản là vì tính trật tự không phải là một thang điểm tuyến tính từ 0 đến 10 như trong trường tiểu học. Có trật tự mặt này thì mất trật tự mặt khác.

    Nhắc lại, xếp đặt bảng mã âm vần trước hết là để giải mã hiệu quả.

    Một, phép giải mã C -> C* là một phép chuyển vị ma trận (đổi hàng thành cột và ngược lại). Phép chuyển vị, được giới thiệu ở revision 2019, nhằm nhóm lại gần nhau các âm vần [nửa] mở và [nửa] khép cùng dạng (1), để tăng hiệu quả cho 2 phép toán dưới đây. Phép chuyển vị chỉ nhanh khi cả số hàng lẫn số cột của ma trận đều là luỹ thừa của 2. Mã C (và C*) không có tính chất này.

    Hai, bảng mã tốt phải cho phép thử nhanh một mã âm vần xem nó có một dạng nhất định nào đó hay không. Cụ thể là những dạng sau. Chú ý rằng chúng không rời nhau, mà chồng lấn lên nhau.

    • ex, êx, ix kể cả u/u.
    • ix, kể cả u/u.
    • u/u.
    • oax/uax, x/x, oex/uex, ix/uix (không kể iau/u).


    Trong đó, dạng thứ nhất cần nhận dạng tuyêt đối chính xác bởi vì nó phân định phụ âm đầu (cụ thể, g/ghng/ngh); dạng thứ hai nếu có thể nhận dạng chính xác thì tốt vì nó phân định phụ âm đầu gi/g (mã B), nhưng nếu không thể thì cũng không sao vì mã gi có thể luôn diễn giải là chữ gi, đẩy việc phân định xuống âm vần (mã B+/B++); hai dạng còn lại không đòi hỏi nhận dạng chính xác vì chúng phân định âm vần. (Chúng phải được nhận dạng khi phụ âm đầu lần lượt là -- và q.) Không cần nhận dạng chính xác nghĩa là có thể nhận dạng gần đúng: thay vì xét xem một mã âm vần có dạng S nào đó hay không thì xét nghiệm nó với một tập S' nào đó bao hàm S. Mọi phiên bản trước đây đều không cho phép xét nghiệm nhanh, hoặc chỉ cho phép với những điều kiện hạn chế dữ liệu khả dĩ, làm suy giảm tính khái quát của mã.

    Ba, nhiều mã âm vần có 2 giá trị, chẳng hạn mã iêu/yêu. Bảng mã tốt phải cho phép phân định giá trị (tính iêu/yêu -> iêuiêu/yêu -> yêu) một cách hữu hiệu. Nghĩa là các âm vần đa trị cùng dạng phải được bố trí gần nhau trong bảng mã. Lý do là việc này liên quan mật thiết với việc trên: một mã âm vần đa trị x luôn được phân định sau khi xét nghiệm và biết x thuộc S'; do phân định là tính giá trị mới cho mọi x thuộc S', để tiết kiệm dung lượng bộ nhớ, S' phải càng gọn càng tốt, S' = S là lý tưởng. Trong 3 phiên bản mới đây, chỉ phiên bản "bá đạo" có tính chất này. Phiên bản "vương đạo" chỉ còn phần nào giữ được tính chất này, và phiên bản "đế đạo" thì hoàn toàn không.

    Vì lẽ trên, những ngày cuối tháng 9 này, mình phác thảo một phiên bản nữa. Các nhà lý thuyết sẽ không thích nó. Nó không đi theo "hoàng đạo" hay một "đạo" cao vời nào đó mà ngược lại, theo "tà đạo". Cái "đạo" tối hạ, tầm thường, là nhắm vào 3 vấn đề trên và chỉ thế mà thôi. Nhưng với mình, một kẻ thực dụng luôn tin rằng có thực mới vực được đạo, hiệu quả mới là tiêu chí số 1 và giải được dứt điểm 3 vấn đề ấy đã là tiến bộ lớn.

    Phiên bản này không có mã C (2). Bảng mã D, xem như một ma trận 8 hàng * 16 cột, được chuyển vị thành một ma trận 8 cột * 16 hàng, gọi là mã D+. Tuy nhiên, như thông lệ, D và D+ được hiển thị dưới hai định dạng nghịch nhau: D ở dạng ma trận chủ hàng còn D+ ma trận chủ cột. Thành thử rút cuộc bảng mã D+ cũng có 8 hàng * 16 cột và nội dung giống hệt D, chỉ hoán đổi tiêu đề hàng với cột (Bảng 3h). Bất kể hiển thị bảng mã thế nào, giải mã D -> D+ là hoán vị 2 chữ số [hex] của mã âm vần. Ví dụ, 0x69 -> 0x96.

    Được ưu tiên bố trí vào bảng mã D+, ở đoạn [0x71,0xC1), là 39 âm vần (15 [nửa] mở và 24 [nửa] khép) của 4 dạng đặc biệt kể trên. Trong đó, dạng thứ nhất (ex, êx, ix), gồm 22 âm vần (8 [nửa] mở và 14 [nửa] khép,) vốn bao hàm cả dạng thứ hai, dạng thứ ba và một phần của dạng thứ tư, được bố trí trước tiên và bố trí ở đầu đoạn; cuối cùng, và ở cuối đoạn, là phần còn lại của dạng thứ tư (oax, x, oex) với 17 âm vần (7 [nửa] mở và 10 [nửa] khép.)

    Các âm vần còn lại được bố trí vào các ô còn trống một cách tùy ý, miễn là thỏa ràng buộc thường lệ để mã V tương dung với UTF-8. Nhắc lại [bài #17], ràng buộc ấy là 56 mã số đầu của mã D dành cho các âm vần [nửa] mở (3) còn 72 mã số cuối dành cho các âm vần [nửa] khép.

    Bảng 3h. (Phác thảo) 120 âm vần của mã D+. Chỉ hiển thị 15 + 24 = 39 âm (theo mô hình 8 thanh truyền thống) thuộc 4 dạng đặc biệt nói trên, vốn được ưu tiên bố trí vào bảng mã. Các âm còn lại được biểu thị bằng dấu : và . lần lượt ứng với [nửa] mở và [nửa] khép. Với những âm có nhiều giá trị, như ênh/êch, oa/ua, oăn/uăn/oăt/uăt hay iêng/yêng/iêc/yêc, chỉ hiển thị tiêu biểu 1 giá trị.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    
    ====================================================================================================
    _0  :     :     :     :     :     :     :     :     e     eo    oa    oe    oeo   :     :     :     
                                                                                                        
                                                                                                        
    _1  :     :     :     :     :     :     :     ê     ia    i     oao   oau   :     :     :     :     
                                                                                                        
                                                                                                        
    _2  :     :     :     :     :     :     :     êu    iêu   iu    oai   oay   :     :     :     :     
                                                                                                        
                                                                                                        
    _3                                                  iêm   im    oam   oăm   .     .     .     .     
                                                                                                        
                                                                                                        
    _4  .     .     .     .     .     .     .     ên    iên   in    oan   oăn   .     .     .     .     
                                                                                                        
                                                                                                        
    _5  .     .     .     .     .     .     .     êng   iêng  ing   oang  oăng  .     .     .     .     
                                                                                                        
                                                                                                        
    _6  .     .     .     .     .     .     .     ênh   en    inh   oanh  oen   .     .     .     .     
                                                                                                        
                                                                                                        
    _7  .     .     .     .     .     .     .     êm    eng   em    oem   oeng  .     .     .     .


    Mã D+ được giải thành một biến thể của mã C, gọi là C+, theo Bảng 3i dưới đây. Mã C+ cũng có 192 âm vần như mã C nhưng bảng mã có 256 ô. Các âm được bố trí sao cho có thể dịch từ D+ sang C+ dễ nhất. Cụ thể, mã số _x [hex] của một âm vần [nửa] mở, nửa khép và khép, lần lượt, dịch thành _y với yx, 2x và 2x+1. Ví dụ, 0x72 (êu) của D+ trở thành 0x72 (êu) của C+, còn 0x74 (ên/êt) trở thành 0x78 (ên) và 0x79 (êt).



    Bảng 3i. (Phác thảo) 192 âm vần của mã C+. Chỉ hiển thị 39 + 24 = 63 âm (theo mô hình 6 thanh chính thống) đã được ưu tiên bố trí. Các âm còn lại được biểu thị bằng dấu : và . lần lượt ứng với [nửa] mở và [nửa] khép. Với những âm có 2 giá trị, cụ thể ix/yxoy/uy, như iên/yênoăn/uăn, chỉ hiển thị tiêu biểu 1 giá trị.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    
    ====================================================================================================
    _0  :     :     :     :     :     :     :     :     e     eo    oa    oe    oeo   :     :     :     
                                                                                                        
                                                                                                        
    _1  :     :     :     :     :     :     :     ê     ia    i     oao   oau   :     :     :     :     
                                                                                                        
                                                                                                        
    _2  :     :     :     :     :     :     :     êu    iêu   iu    oai   oay   :     :     :     :     
                                                                                                        
                                                                                                        
    _3                                                                                                  
                                                                                                        
                                                                                                        
    _4                                                                                                  
                                                                                                        
                                                                                                        
    _5                                                                                                  
                                                                                                        
                                                                                                        
    _6                                                  iêm   im    oam   oăm   .     .     .     .     
                                                                                                        
                                                                                                        
    _7                                                  iêp   ip    oap   oăp   .     .     .     .     
                                                                                                        
                                                                                                        
    _8  .     .     .     .     .     .     .     ên    iên   in    oan   oăn   .     .     .     .     
                                                                                                        
                                                                                                        
    _9  .     .     .     .     .     .     .     êt    iêt   it    oat   oăt   .     .     .     .     
                                                                                                        
                                                                                                        
    _A  .     .     .     .     .     .     .     êng   iêng  ing   oang  oăng  .     .     .     .     
                                                                                                        
                                                                                                        
    _B  .     .     .     .     .     .     .     êc    iêc   ic    oac   oăc   .     .     .     .     
                                                                                                        
                                                                                                        
    _C  .     .     .     .     .     .     .     ênh   en    inh   oanh  oen   .     .     .     .     
                                                                                                        
                                                                                                        
    _D  .     .     .     .     .     .     .     êch   et    ich   oach  oet   .     .     .     .     
                                                                                                        
                                                                                                        
    _E  .     .     .     .     .     .     .     êm    eng   em    oem   oeng  .     .     .     .     
                                                                                                        
                                                                                                        
    _F  .     .     .     .     .     .     .     êp    ec    ep    oep   oec   .     .     .     .


    Mã C+ được giải thành một biến thể của mã B, chỉ rõ bởi Bảng 3g sau đây. Dễ nhận ra, biến thể này chính là mã B++ (4). Bảng này có 16*22 = 352 ô, nhưng chỉ có 192 + 63 = 255 ô không trống, mỗi ô biểu thị một âm vần nào đó của mã B++ vốn cũng chính là một ký tự của mã A4. Như thường lệ, mã A4 đầy đủ còn có nhiều hơn 255 ký tự do chứa cả những ký tự chỉ dùng trong phụ âm đầu, như b, d, g, h. Cũng như thường lệ, nó có những ký tự giống nhau về hình thái nhưng khác nhau về nội hàm, chẳng hạn, êu trong phễuêu trong giễu, hay ua trong cuaua trong qua. Bỏ qua khác biệt ấy, mã A4 chỉ có 257 ký tự [bài #59] và có thể giải thành mã A2 với 121 ký tự [bài #57].

    Như thường lệ, các mã số được bố trí để cho dễ dịch từ C+ sang B++: mỗi công thức dịch có một hằng ∆ sao cho mã số x bất kỳ được dịch thành x + ∆ (hay x XOR ∆, tùy thích.) Thí dụ, công thức dịch cho mã âm vần dạng thứ hai (ix -> x, như gi-iêng -> gi-êng) ánh xạ cột 8_, 9_ sang cột 14_, 15_, nghĩa là có ∆ = 0xC0 (hay 0x1C0, cho phép XOR.)



    Bảng 3g (phiên bản 2021-9-24.) (Phác thảo) Bảng mã âm vần của mã B++. Chỉ hiển thị 63 + 63 = 126 âm đã được ưu tiên bố trí trong bảng mã. Từ đây, "âm" đã thoát khỏi nghĩa ngữ âm, chỉ còn nghĩa chính tả: mỗi âm chỉ có 1 giá trị.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  :     :     :     :     :     :     :     :     e     eo    oa    oe    oeo   :     :     :                 ua    ue    ueo   eo    
    _1  :     :     :     :     :     :     :     ê     ia    i     oao   oau   :     :     :     :           ui    uao   uau         --    
    _2  :     :     :     :     :     :     :     êu    iêu   iu    oai   oay   :     :     :     :     yêu   uiu   uai   uay   êu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  iêm   im    oam   oăm   .     .     .     .     yêm   uim   uam   uăm         m     
    _7                                                  iêp   ip    oap   oăp   .     .     .     .     yêp   uip   uap   uăp   êp    p     
    _8  .     .     .     .     .     .     .     ên    iên   in    oan   oăn   .     .     .     .     yên   uin   uan   uăn         n     
    _9  .     .     .     .     .     .     .     êt    iêt   it    oat   oăt   .     .     .     .     yêt   uit   uat   uăt   êt    t     
    _A  .     .     .     .     .     .     .     êng   iêng  ing   oang  oăng  .     .     .     .     yêng  uing  uang  uăng  êng   ng    
    _B  .     .     .     .     .     .     .     êc    iêc   ic    oac   oăc   .     .     .     .     yêc   uic   uac   uăc   êc    c     
    _C  .     .     .     .     .     .     .     ênh   en    inh   oanh  oen   .     .     .     .           uinh  uanh  uen   en    nh    
    _D  .     .     .     .     .     .     .     êch   et    ich   oach  oet   .     .     .     .           uich  uach  uet   et    ch    
    _E  .     .     .     .     .     .     .     êm    eng   em    oem   oeng  .     .     .     .                 uem   ueng  eng         
    _F  .     .     .     .     .     .     .     êp    ec    ep    oep   oec   .     .     .     .                 uep   uec   ec

    EDIT 2021-10-1. Mình gửi thêm một phiên bản của mã B++ (xem Bảng 3g dưới). Bốn dạng đặc biệt vẫn được bố trí vào 1 đoạn, nhưng hoán đổi thứ tự của dạng thứ nhất và phần còn lại của dạng thứ tư. Từ đây, dễ dàng suy ra mã C+ và D+ (xem ở trên) và mã B+ (xem [#62] dưới). Phiên bản này có thể là điểm xuất phát cho ai muốn phát triển theo "bá đạo" [#58]. Mình đã đi đến nó trước khi đổi hướng theo "vương đạo" [#59], với kết quả là phiên bản 2021-9-27 [#63].

    Bảng 3g (phiên bản 2021-9-25.) (Phác thảo) Bảng mã âm vần của mã B++.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  :     :     :     :     :     :     :     :     oa    oe    oeo   e     eo    :     :     :     ua    ue    ueo         oeo   e     
    _1  :     :     :     :     :     :     :     :     oao   oau   i     ia    ê     :     :     :     uao   uau   ui          --          
    _2  :     :     :     :     :     :     :     :     oai   oay   iu    iêu   êu    :     :     :     uai   uay   uiu   yêu         êu    
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  oam   oăm   im    iêm   êm    .     .     .     uam   uăm   uim   yêm   m           
    _7                                                  oap   oăp   ip    iêp   êp    .     .     .     uap   uăp   uip   yêp   p     êp    
    _8  .     .     .     .     .     .     .     .     oan   oăn   in    iên   ên    .     .     .     uan   uăn   uin   yên   n           
    _9  .     .     .     .     .     .     .     .     oat   oăt   it    iêt   êt    .     .     .     uat   uăt   uit   yêt   t     êt    
    _A  .     .     .     .     .     .     .     .     oang  oăng  ing   iêng  êng   .     .     .     uang  uăng  uing  yêng  ng    êng   
    _B  .     .     .     .     .     .     .     .     oac   oăc   ic    iêc   êc    .     .     .     uac   uăc   uic   yêc   c     êc    
    _C  .     .     .     .     .     .     .     .     oanh  oen   inh   en    ênh   .     .     .     uanh  uen   uinh        nh    en    
    _D  .     .     .     .     .     .     .     .     oach  oet   ich   et    êch   .     .     .     uach  uet   uich        ch    et    
    _E  .     .     .     .     .     .     .     .     oem   oeng  em    eng   .     .     .     .     uem   ueng              em    eng   
    _F  .     .     .     .     .     .     .     .     oep   oec   ep    ec    .     .     .     .     uep   uec               ep    ec

    Bảng (mảng) mã âm vần có 16*22 phần tử và bảng (mảng) mã phụ âm đầu có khoảng 32 phần tử. Mỗi phần tử là một xâu không quá 2 ký tự A2 (mỗi ký tự 7 bit) và một số tự nhiên 2 bit là độ dài xâu (5), vừa khít 2 byte. Vậy, thuật toán giải mã tiền tố từ mã V đến mã A2 chiếm khoảng (16*22+32)*2 = 768 byte bộ nhớ dữ liệu.



    EDIT 2021-10-2. Phiên bản 2021-9-24 (và cả 25) cũng cho phép lập mã B+, xem [#62] dưới, nhưng không cho phép lập mã B bởi vì xếp đặt âm vần trong bảng mã D+ (và do đó, C+ và B nếu có) không cho phép nhận dạng nhanh và chính xác mã âm vần dạng thứ hai. Song, đó không phải là một hạn chế căn bản. Có thể tạo ra một phiên bản cho phép nhận dạng nhanh và chính xác dạng thứ hai và nhờ thế, lập được cả mã B, xem Bảng 3c dưới đây. Nó được giải sang mã A2 theo Bảng 9 [bài #57]. Có thể xem nó là "tà đạo" đã phát triển đến cùng: do bỏ trống 2 cột cuối, nó tiết kiệm được 64 byte. Tuy nhiên, nếu dùng nó để xác lập mã B+ hai cột cuối sẽ được lấp đầy và như thế nó còn thua cả phiên bản trước (2021-9-24) [#62] về tiêu dùng bộ nhớ. Vả lại, so với 2 phiên bản ngày 24 và 25, nó có khuyết điểm là không mã hoá được chữ qiêm, qiêp. (Nếu mã hoá 2 chữ này, do iêm,iêp chen vào trong khoảng dành cho uix, để cho hiệu quả chúng sẽ phải được giải mã giống như uix, nghĩa là bằng cột 12_ thay vì cột A_, thế là đụng độ với yêm,yêp.) Khuyết điểm rất nhỏ, chỉ có tính kỹ thuật, nhưng cảnh tỉnh. Nó cho thấy giải mã bằng cách phân định phụ âm đầu (mã B) là một con đường chông gai dẫn đến một tương lai bấp bênh.


    Bảng 3c. (Phiên bản 2021-9-26.) (Phác thảo) Bảng mã âm vần của mã B.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  :     :     :     :     :     :     :     :     oa    oe    oeo   i     eo    :     :     :     ua    ue    ueo   ui                
    _1  :     :     :     :     :     :     :     :     oao   oau   e     ia    ê     :     :     :     uao   uau                           
    _2  :     :     :     :     :     :     :     :     oai   oay   iu    iêu   êu    :     :     :     uai   uay   uiu   yêu               
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  oam   oăm   im    iên   êm    .     .     .     uam   uăm   uim   yên               
    _7                                                  oap   oăp   ip    iêt   êp    .     .     .     uap   uăp   uip   yêt               
    _8  .     .     .     .     .     .     .     .     oan   oăn   in    iêng  ên    .     .     .     uan   uăn   uin   yêng              
    _9  .     .     .     .     .     .     .     .     oat   oăt   it    iêc   êt    .     .     .     uat   uăt   uit   yêc               
    _A  .     .     .     .     .     .     .     .     oang  oăng  ing   em    êng   .     .     .     uang  uăng  uing                    
    _B  .     .     .     .     .     .     .     .     oac   oăc   ic    ep    êc    .     .     .     uac   uăc   uic                     
    _C  .     .     .     .     .     .     .     .     oanh  oen   inh   en    ênh   .     .     .     uanh  uen   uinh                    
    _D  .     .     .     .     .     .     .     .     oach  oet   ich   et    êch   .     .     .     uach  uet   uich                    
    _E  .     .     .     .     .     .     .     .     oem   oeng  iêm   eng   .     .     .     .     uem   ueng  yêm                     
    _F  .     .     .     .     .     .     .     .     oep   oec   iêp   ec    .     .     .     .     uep   uec   yêp

    Tuy tiêu tốn bộ nhớ hơn đáng kể so với các phiên bản trước, nhưng phiên bản này (2021-9-24, 25 và 26) mới thực sự thân thiện với phần cứng và nhìn chung, cả phần mềm. Nó là phiên bản đầu tiên đủ sức đạt mục tiêu là không cho phép bất cứ ngôn ngữ nào nhanh hơn tiếng Việt.





    ____________________
    (1) Theo thông lệ [bất thành văn] từ revision 2018, "[nửa] mở" nghĩa là mở hoặc nửa mở và, tương tự, "[nửa] khép" nghĩa là nửa khép hoặc khép.

    (2) Thật ra, có thể xác lập được mã C, sao cho 4 mũi tên D -> C -> C+ và D -> D+ -> C+ tạo thành 1 hình vuông giao hoán. Diễn "nôm" là có 2 cách (2 trình tự) giải mã: thông qua C hoặc thông qua D+. Không cách nào tốt hơn cách nào. Mình chọn trình bày cách thứ hai vì nó có vẻ tự nhiên hơn. (Nó nảy ra trước trong đầu mình.) Mình bỏ qua cách thứ nhất vì đơn giản, ai biết cách này cũng tự nghĩ ra được cách kia.

    (3) Thực tế, chỉ dùng 48 mã số. Với phép chuyển vị ma trận mới, 48 âm vần [nửa] mở không nhất thiết phải lấy 48 mã số liên tiếp và thậm chí số âm vần [nửa] mở không bị giới hạn ở 48. Tuy vậy, cấp phát mã số từ [0,48) và để dành [48,56) cho tương lai xem ra vẫn là hợp lý nhất.

    (4) Bỏ qua một khác biệt không căn bản, là mã phụ âm đầu. Mọi phiên bản cũ của mã B++ đều không có phụ âm đầu y vì đều chỉ nhằm mã đích A4'. Phiên bản này giải mã sâu hơn, đến đích A2, vốn không loại trừ bất cứ dạng chữ Việt nào.

    (5) Thật ra, độ dài xâu chỉ có mặt ở mã phụ âm đầu chứ không có mặt ở mã âm vần. Một xâu không thay đổi ý nghĩa (vị trí trong tự điển) nếu nó được kéo dài bằng một vài dấu trắng. Dấu trắng là ký tự vô nghĩa.
    Đã được chỉnh sửa lần cuối bởi Ada : 18-10-2021 lúc 09:59 PM. Lý do: Thêm vài chú thích
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  2. #62
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Để cho đầy đủ, mình liệt kê cho phiên bản này cả mã B+ và A3 (A3').

    Cần nhắc lại ngay rằng các mã này được thiết kế để tăng hiệu quả giải mã (giảm tiêu dùng bộ nhớ), trả giá bằng việc phải mã hoá dữ liệu một cách khác thường: giống như chữ giêng mã hoá thành gi-iêng, chữ yêng phải mã hoá thành y-yêng thay vì --yêng [#24]. Nhắc lại, cách mã hoá khác thường này chỉ dùng cho chữ có dạng u, còn chữ y vẫn được mã hoá bằng --y như bình thường [#53].

    Nói cho cùng, không có cách mã hoá nào là hoàn toàn "bình thường" cả. Sớm muộn gì ta cũng sẽ phải giải một bài toán nữa. Mã hoá các chữ iêu, ynh,... (1). Để đáp ứng một yêu cầu tự nhiên, là tính đóng: chữ PV là chữ Việt khi và chỉ khi P và V cũng thế. Mã hoá được iêu, ynh,... là thoả được dứt điểm một nửa mệnh đề. Phần "chỉ khi" (2). Phần cốt yếu nhất. Nhắc lại [#37], nhưng lần này mình không nói đùa, tính đóng diễn "nôm" là khả năng mã hoá được những câu trong sách vỡ lòng. Không phải những câu "gia là nhà, quốc là nước" (Ngô Thời Nhiệm) đâu. Những câu như "tiêu tiêu" hay "khuynh khuynh" cơ (3).



    Bảng 13 (sửa đổi.) Mã hoá các chữ có dạng u.
    Code:
    Chữ     Mã
    ======= ========
    yêu     y-yêu


    Phép giải mã B+ như thường lệ, tương tự mã B++. Ví dụ, công thức dịch cho mã âm vần dạng thứ hai và một trường hợp của dạng thứ ba (ix/yx -> x, như gi-iêng -> gi-êngy-yêng -> y-êng) có ∆ = 0xC0. Hoặc 0x1C0 nếu chọn dùng phép XOR. Xem Bảng 3d.

    Nhắc lại, nếu mã B+ có thêm 7 âm vần dạng u (là yêu, yêm, yêp, yên, yêt, yêng, yêc) và mã A3 (A3') thêm 7 ký tự tương ứng thì kết quả lần lượt là B++ và A4 (A4'). Vậy, A3 (A3') có 257 - 7 = 250 ký tự (Bảng 7).

    Bảng 3d (phiên bản 2021-9-24.) (Phác thảo) Các âm vần của mã B+. Chỉ hiển thị 63 + 58 = 121 âm đã được ưu tiên bố trí vào bảng mã.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  :     :     :     :     :     :     :     :     e     eo    oa    oe    oeo   :     :     :                 ua    ue    ueo   eo    
    _1  :     :     :     :     :     :     :     ê     ia    i     oao   oau   :     :     :     :           ui    uao   uau         --    
    _2  :     :     :     :     :     :     :     êu    iêu   iu    oai   oay   :     :     :     :           uiu   uai   uay   êu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  iêm   im    oam   oăm   .     .     .     .           uim   uam   uăm   êm    m     
    _7                                                  iêp   ip    oap   oăp   .     .     .     .           uip   uap   uăp   êp    p     
    _8  .     .     .     .     .     .     .     ên    iên   in    oan   oăn   .     .     .     .           uin   uan   uăn   ên    n     
    _9  .     .     .     .     .     .     .     êt    iêt   it    oat   oăt   .     .     .     .           uit   uat   uăt   êt    t     
    _A  .     .     .     .     .     .     .     êng   iêng  ing   oang  oăng  .     .     .     .           uing  uang  uăng  êng   ng    
    _B  .     .     .     .     .     .     .     êc    iêc   ic    oac   oăc   .     .     .     .           uic   uac   uăc   êc    c     
    _C  .     .     .     .     .     .     .     ênh   en    inh   oanh  oen   .     .     .     .           uinh  uanh  uen   en    nh    
    _D  .     .     .     .     .     .     .     êch   et    ich   oach  oet   .     .     .     .           uich  uach  uet   et    ch    
    _E  .     .     .     .     .     .     .     êm    eng   em    oem   oeng  .     .     .     .                 uem   ueng  eng         
    _F  .     .     .     .     .     .     .     êp    ec    ep    oep   oec   .     .     .     .                 uep   uec   ec

    Bảng 7 (phiên bản 2021-9-24.) 250 ký tự của mã A3, A3'.
    Code:
    --   ât   êu    m     oe    ôt    uat   uêc   uôp   uyt   
    a    âu   f     n     oec   ơ     uau   uêch  uôt   uyu   
    ac   ây   g     ng    oem   ơc    uay   uên   uơ    ư     
    ach  b    h     nh    oen   ơi    uăc   uêng  uơc   ưa    
    ai   c    i     o     oeng  ơm    uăm   uênh  uơi   ưc    
    am   ch   ia    oa    oeo   ơn    uăn   uêt   uơn   ưi    
    an   d    ic    oac   oep   ơng   uăng  uêu   uơng  ưm    
    ang  đ    ich   oach  oet   ơp    uăp   ui    uơt   ưn    
    anh  e    iêc   oai   oi    ơt    uăt   uic   up    ưng   
    ao   ec   iêm   oam   om    p     uâc   uich  ut    ươc   
    ap   em   iên   oan   on    q     uân   uim   uưc   ươi   
    at   en   iêng  oang  ong   r     uâng  uin   uưn   ươm   
    au   eng  iêp   oanh  ooc   s     uât   uing  uưng  ươn   
    ay   eo   iêt   oao   oong  t     uâu   uinh  uưt   ương  
    ăc   ep   iêu   oap   op    u     uây   uip   uy    ươp   
    ăm   et   im    oat   ot    ua    uc    uit   uya   ươt   
    ăn   ê    in    oau   ô     uac   ue    uiu   uych  ươu   
    ăng  êc   ing   oay   ôc    uach  uec   um    uyêc  ưp    
    ăp   êch  inh   oăc   ôi    uai   uem   un    uyên  ưt    
    ăt   êm   ip    oăm   ôm    uam   uen   ung   uyêng ưu    
    âc   ên   it    oăn   ôn    uan   ueng  uôc   uyêt  v     
    âm   êng  iu    oăng  ông   uang  ueo   uôi   uym   w     
    ân   ênh  j     oăp   ôôc   uanh  uep   uôm   uyn   x     
    âng  êp   k     oăt   ôông  uao   uet   uôn   uynh  y     
    âp   êt   l     oc    ôp    uap   uê    uông  uyp   z


    Mã A4' không dùng được vì có nhiều hơn 256 ký tự. Nhưng mã A3' thì không có vấn đề đó, nên vẫn dùng được như thường. Nhờ thế, mỗi phần tử của bảng (mảng) âm vần chỉ còn 1 byte, và thuật toán giải mã chỉ tiêu dùng hết khoảng 16*22 + 32*2 = 416 byte (4).

    Ngoài ra, để ý rằng cột 10_ của bảng (mảng) mã âm vần của B+ hoàn toàn bỏ trống. Nên có thể tịnh tiến các cột sau nó về phía trước 1 cột và nhờ thế, tiết kiệm được 16 byte nữa.

    Cố nhiên, nếu làm thế, ta phải chia tay phép XOR. Mọi công thức giải mã đều phải dùng phép cộng.

    Ai biết ngôn ngữ Fortran cũng biết câu nói đùa GOD is REAL, unless declared INTEGER. Số là trong Fortran, mọi tên đều có kiểu REAL, ngoại trừ các tên bắt đầu bằng một trong 7 chữ cái H, I, J, K, L, M, N, vốn có kiểu INTEGER. Mặc định là thế; còn nếu khai báo tường minh, tên có thể mang kiểu nào cũng được.

    Fortran quy định như thế vì chiếc máy tính điện tử đầu tiên dùng nó, IBM 7094, có 7 thanh ghi chỉ số. Và ngay cả chiếc máy tính này cũng biết làm phép cộng chỉ số!

    Đấy là Fortran IV. Còn trong Fortran I, chỉ các tên bắt đầu bằng chữ cái I, J, K là ngầm mang kiểu INTEGER. Chiếc máy tính tương ứng, IBM 704, chỉ có 3 thanh ghi chỉ số. Nó chỉ biết làm phép OR chỉ số (5).

    Trên là chuyện của 64 năm trước. Chiếc IBM 704 đã vào viện bảo tàng từ lâu. Mình không biết bộ vi xử lý, vi điều khiển hiện đại nào có phép XOR nhanh hơn phép cộng.

    Trong các việc thường ngày, mình không thể sống thiếu phép XOR. Nhưng riêng trong việc này, mình không bị nó ám ảnh. Phép cộng cũng đủ rồi.





    ______________________
    (1) Có thể xem xét mã hóa chữ u bằng --u/u và chữ yx bằng y-ix/uix. Nghĩa là mã số ix/uix sẽ tải thêm một giá trị nữa, là yx. Và để giải mã, giống như luật gi-ix -> gi-x, ta cũng có luật y-yx -> y-x.

    (2) Phần đảo là bất khả thi. Không có cách nào mã hoá chữ lynh dẫu mã hoá được cả hai chữ l lẫn ynh.

    (3) Thử hỏi, nếu không lưu truyền được những câu ấy thì hậu thế làm sao biết đánh vần, nói gì đọc, hiểu được thế nào là "nhất tiếu khuynh thành"? Nếu không mã hóa sách vỡ lòng thì trẻ em nghe bài giảng trực tuyến, nhìn sách kỹ thuật số rồi đây làm sao cảm thụ những vần thơ bất hủ, "thêm nến giá nối hương bình, cùng nhau lại chuốc chén quỳnh giao hoan" (Nguyễn Du)? Rắc rối là ở chỗ chữ ya trong một câu dạy đánh vần, như "khuya khuya", phải đọc là ia (thay vì ja) và tương tự, chữ yu trong "khuyu khuyu" phải đọc là iu (thay vì ju). Không có thuật toán [hữu hiệu] nào phân định được hai cách đọc ấy. Cho nên hai chữ ya (ia, khác ja) và yu (iu, khác ju), tuy có mã, nhưng mã hoá không dễ chút nào. Vấn đề của hai chữ này trong cách đánh vần truyền thống, tuy nhiên, vẫn khác với các chữ ua, ui,... trong cách đánh vần chính thống. Sách vỡ lòng chính thống "qua qua", "đua đua" [#37] hay "qui qui", "đui đui" [#57] không thể mã hoá. Còn sách vỡ lòng truyền thống "khuya khuya", "khuyu khuyu" vẫn mã hoá được. Bằng một thuật toán chuyên biệt cho sách vỡ lòng (vốn tuân thủ chính âm, nghĩa là không chứa các từ có phụ âm đầu y, như Ya-ly, Yu-đa.)

    (4) Đây chỉ là ước lượng. Bảng (mảng) mã phụ âm đầu có nhiều hơn 32 phần tử. Và mỗi phần tử có nhiều hơn 16 bit vì còn phải chứa cả độ dài phụ âm đầu. Cách này cũng không phải là cách làm duy nhất. Trên một bộ xử lý x86 thông dụng, tách một phần tử ra 2 thành phần (giá trị và độ dài) tiêu dùng 3 phép tính và 2 xung nhịp. Nếu các âm đầu được sắp (gán mã số) theo thứ tự độ dài, thì độ dài của âm đầu p là (0 < p) + (22 < p) và x86 có thể tính được biểu thức này cũng chỉ bằng 3 phép tính và 2 xung nhịp.

    (5) Phép OR là một trường hợp riêng của phép XOR, phép cộng. Ba phép tính này cho kết quả giống nhau nếu 2 bit cùng hàng không cùng bằng 1.
    Đã được chỉnh sửa lần cuối bởi Ada : 05-11-2021 lúc 08:20 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  3. #63
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Vẫn còn vài ngày nữa mới hết tháng "nghỉ lễ" COVID dài đằng đẵng này. Thừa giấy làm chi chẳng vẽ voi?

    Trong bài trước, mình dẫn máy tính IBM làm chứng rằng chuyện phép XOR nhanh hơn phép cộng phản ánh tư duy công nghệ những năm 50 và chuyện ấy đã chấm dứt từ những năm 60 của thế kỷ trước, vì thế với mình, "phép cộng cũng đủ rồi". Nhưng nói xong câu ấy, mình biết là đã hớ.

    Xin nêu một phản ví dụ, về công nghệ những năm cuối thập kỷ 60. Bảng mã ASCII.

    Trong ASCII, một chữ cái viết thường đứng sau biến thể viết hoa của nó 32 vị trí. Nhờ thế, có thể làm phép tính to_upper, to_lower không những bằng phép cộng (trừ) mà còn cả phép XOR. Có thể tính được to_lower(H) = h với chi phí về cả bộ nhớ lẫn thời gian như nhau bất kể dùng phép cộng hay phép XOR. Nhưng thử tính to_lower(h) xem. Không muốn tốn thời gian kiểm tra miền xác định, nếu dùng phép XOR, to_lower(h) = H, còn nếu dùng phép cộng thì to_lower(h) = BS. Nghĩa là, khi dữ liệu đầu vào nằm ngoài kỳ vọng, phép XOR vẫn cho kết quả dễ coi, còn phép cộng cho... bullsh!t. Vậy, theo một nghĩa nào đó, phép XOR có khả năng sửa lỗi mà phép cộng không có.

    Và kết quả BS ấy là trong trường hợp tốt nhất, khi lập trình viên chịu tăng gấp đôi chi phí thời gian hay không gian (làm phép cộng mod 128 trên thanh ghi > 7 bit hoặc kéo dài bảng mã 128 byte thành 256 byte và làm phép cộng mod 256 trên thanh ghi 8 bit.) (1) Nếu lập trình viên không cẩn thận đến thế, phép cộng sẽ sinh hành tung bất định. Tương phản với phép XOR.

    Cách mà mình đã nêu để tiết kiệm 16 byte có thể xem là thiếu chuyên nghiệp. Là "chưa học thuộc quá khứ mà đòi tám chuyện tương lai."

    Sau đây, mình trình bày một thiết kế mới. Chuyên nghiệp hơn.

    Cũng giống như khi nêu giải pháp này lần đầu, dưới danh nghĩa nhằm tiết kiệm 1 byte [bài #59], lần này, tuy chỉ nhằm tiết kiệm 16 byte, nó đòi hỏi thay đổi cơ bản trong kiến trúc bảng mã và thuật toán giải mã. Cụ thể, giải mã bằng phép XOR. Nghĩa là phải từ bỏ "tà đạo" và quay về "chính đạo" mà trong trường hợp này, đó là "vương đạo" [#59].

    Vì cách dựng mã theo "vương đạo", gồm 5 bước, đã từng được giới thiệu chi tiết [bài #59], ở đây xin chỉ nêu kết quả từng bước. Mã được dựng là mã B+. Từ đó dễ dàng suy ngược ra các mã C+, D+, D theo định nghĩa của chúng [#61].



    1. Bố trí các âm vần ixuyx có đôi lần lượt vào cột 8_, 9_C_, D_.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  :     :     :     :     :     :     :     :     :     :     :     :     :     :     :     :                                         
    _1  :     :     :     :     :     :     :     :     i     ia    :     :     uy    uya   :     :     i           --          y     ya    
    _2  :     :     :     :     :     :     :     :     iu    :     :     :     uyu   :     :     :     iu                      yu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  im    .     .     .     uym   .     .     .     im          m           ym          
    _7                                                  ip    .     .     .     uyp   .     .     .     ip          p           yp          
    _8  .     .     .     .     .     .     .     .     in    iên   .     .     uyn   uyên  .     .     in          n     ên    yn    yên   
    _9  .     .     .     .     .     .     .     .     it    iêt   .     .     uyt   uyêt  .     .     it          t     êt    yt    yêt   
    _A  .     .     .     .     .     .     .     .     .     iêng  .     .     .     uyêng .     .                       êng         yêng  
    _B  .     .     .     .     .     .     .     .     .     iêc   .     .     .     uyêc  .     .                       êc          yêc   
    _C  .     .     .     .     .     .     .     .     inh   .     .     .     uynh  .     .     .     inh         nh          ynh         
    _D  .     .     .     .     .     .     .     .     ich   .     .     .     uych  .     .     .     ich         ch          ych         
    _E  .     .     .     .     .     .     .     .     .     .     .     .     .     .     .     .                                         
    _F  .     .     .     .     .     .     .     .     .     .     .     .     .     .     .     .

    2. Bố trí các âm vần ex, êxoex, x có đôi lần lượt vào cột 8_, 9_, A_C_, D_, E_. Như bước trên, nếu công thức giải mã có một phần nào đó không phải là phép đồng nhất trên mã âm vần, nghĩa là có dạng u -> v với u != v, thì bố trí luôn v vào khu vực 6 cột phía sau F_.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  :     :     :     :     :     :     :     :     :     ê     e     :     :     uê    oe    :                       ê           ê     
    _1  :     :     :     :     :     :     :     :     i     ia    eo    :     uy    uya   oeo   :     i           --          y     ya    
    _2  :     :     :     :     :     :     :     :     iu    :     êu    :     uyu   :     uêu   :     iu                      yu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  im    .     ên    .     uym   .     uên   .     im          m           ym          
    _7                                                  ip    .     êt    .     uyp   .     uêt   .     ip          p           yp          
    _8  .     .     .     .     .     .     .     .     in    iên   en    .     uyn   uyên  oen   .     in          n     ên    yn    yên   
    _9  .     .     .     .     .     .     .     .     it    iêt   et    .     uyt   uyêt  oet   .     it          t     êt    yt    yêt   
    _A  .     .     .     .     .     .     .     .     .     iêng  eng   .     .     uyêng oeng  .                       êng         yêng  
    _B  .     .     .     .     .     .     .     .     .     iêc   ec    .     .     uyêc  oec   .                       êc          yêc   
    _C  .     .     .     .     .     .     .     .     inh   em    êng   .     uynh  oem   uêng  .     inh         nh    em    ynh   em    
    _D  .     .     .     .     .     .     .     .     ich   ep    êc    .     uych  oep   uêc   .     ich         ch    ep    ych   ep    
    _E  .     .     .     .     .     .     .     .     ênh   .     .     .     uênh  .     .     .                 ênh         ênh         
    _F  .     .     .     .     .     .     .     .     êch   .     .     .     uêch  .     .     .                 êch         êch

    3. Bố trí các đôi âm vần (x,wx) còn lại, với w là âm đệm. Như bước trên, sao cho thỏa hệ thức x XOR wx = 0x40 giữa 2 mã số tương ứng. Nghĩa là hai âm vần cặp đôi với nhau được bố trí vào cùng hàng và vào hai cột k, k XOR 4, với k nào đó.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  a     ơ     ơi    :     oa    uơ    uơi   :     :     ê     e     :     :     uê    oe    :                       ê           ê     
    _1  ao    au    âu    :     oao   oau   uâu   :     i     ia    eo    :     uy    uya   oeo   :     i           --          y     ya    
    _2  ai    ay    ây    :     oai   oay   uây   :     iu    :     êu    :     uyu   :     uêu   :     iu                      yu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  im    .     ên    .     uym   .     uên   .     im          m           ym          
    _7                                                  ip    .     êt    .     uyp   .     uêt   .     ip          p           yp          
    _8  am    ăm    .     .     oam   oăm   .     .     in    iên   en    .     uyn   uyên  oen   .     in          n     ên    yn    yên   
    _9  ap    ăp    .     .     oap   oăp   .     .     it    iêt   et    .     uyt   uyêt  oet   .     it          t     êt    yt    yêt   
    _A  an    ăn    ân    ưn    oan   oăn   uân   uưn   .     iêng  eng   .     .     uyêng oeng  .                       êng         yêng  
    _B  at    ăt    ât    ưt    oat   oăt   uât   uưt   .     iêc   ec    .     .     uyêc  oec   .                       êc          yêc   
    _C  ang   ăng   âng   ưng   oang  oăng  uâng  uưng  inh   em    êng   .     uynh  oem   uêng  .     inh         nh    em    ynh   em    
    _D  ac    ăc    âc    ưc    oac   oăc   uâc   uưc   ich   ep    êc    .     uych  oep   uêc   .     ich         ch    ep    ych   ep    
    _E  anh   ơng   ơn    .     oanh  uơng  uơn   .     ênh   .     .     .     uênh  .     .     .                 ênh         ênh         
    _F  ach   ơc    ơt    .     oach  uơc   uơt   .     êch   .     .     .     uêch  .     .     .                 êch         êch

    4. Bố trí các đôi âm vần có dạng (ôx, x), kể cả (ô,ua), tương tự trên. Nghĩa là như thể nguyên âm u cũng là âm đệm.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  a     ơ     ơi    :     oa    uơ    uơi   :     ô     ê     e     ôi    ua    uê    oe    uôi                     ê           ê     
    _1  ao    au    âu    :     oao   oau   uâu   :     i     ia    eo    :     uy    uya   oeo   :     i           --          y     ya    
    _2  ai    ay    ây    :     oai   oay   uây   :     iu    :     êu    :     uyu   :     uêu   :     iu                      yu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  im    .     ên    ôm    uym   .     uên   uôm   im          m           ym          
    _7                                                  ip    .     êt    ôp    uyp   .     uêt   uôp   ip          p           yp          
    _8  am    ăm    .     .     oam   oăm   .     .     in    iên   en    ôn    uyn   uyên  oen   uôn   in          n     ên    yn    yên   
    _9  ap    ăp    .     .     oap   oăp   .     .     it    iêt   et    ôt    uyt   uyêt  oet   uôt   it          t     êt    yt    yêt   
    _A  an    ăn    ân    ưn    oan   oăn   uân   uưn   .     iêng  eng   ông   .     uyêng oeng  uông                    êng         yêng  
    _B  at    ăt    ât    ưt    oat   oăt   uât   uưt   .     iêc   ec    ôc    .     uyêc  oec   uôc                     êc          yêc   
    _C  ang   ăng   âng   ưng   oang  oăng  uâng  uưng  inh   em    êng   .     uynh  oem   uêng  .     inh         nh    em    ynh   em    
    _D  ac    ăc    âc    ưc    oac   oăc   uâc   uưc   ich   ep    êc    .     uych  oep   uêc   .     ich         ch    ep    ych   ep    
    _E  anh   ơng   ơn    .     oanh  uơng  uơn   .     ênh   .     .     .     uênh  .     .     .                 ênh         ênh         
    _F  ach   ơc    ơt    .     oach  uơc   uơt   .     êch   .     .     .     uêch  .     .     .                 êch         êch

    5. Bố trí các âm vần còn lại (không có đôi) vào các ô còn trống đã đánh dấu bằng : và . lần lượt theo tính [nửa] mở và [nửa] khép. Kết quả, xem Bảng 3d.

    Bảng 3d (phiên bản 2021-9-27.) Các âm vần của mã B+. Chữ qu có thể mã hoá bằng q-- và, nếu muốn thế, phải định trị -- cho mã số 0x14A và 0x14B.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  a     ơ     ơi    ư     oa    uơ    uơi   ưa    ô     ê     e     ôi    ua    uê    oe    uôi               ô     ê           ê     
    _1  ao    au    âu    ưu    oao   oau   uâu   ươu   i     ia    eo    o     uy    uya   oeo   u     i           --          y     ya    
    _2  ai    ay    ây    ưi    oai   oay   uây   ươi   iu    iêu   êu    oi    uyu   y     uêu   ui    iu                êu    yu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  im    iêm   ên    ôm    uym   oong  uên   uôm   im          m     êm    ym          
    _7                                                  ip    iêp   êt    ôp    uyp   ooc   uêt   uôp   ip          p     êp    yp          
    _8  am    ăm    âm    ưm    oam   oăm   ươm   ươn   in    iên   en    ôn    uyn   uyên  oen   uôn   in          n     ên    yn    yên   
    _9  ap    ăp    âp    ưp    oap   oăp   ươp   ươt   it    iêt   et    ôt    uyt   uyêt  oet   uôt   it          t     êt    yt    yêt   
    _A  an    ăn    ân    ưn    oan   oăn   uân   uưn   ing   iêng  eng   ông   --    uyêng oeng  uông  ing         ng    êng         yêng  
    _B  at    ăt    ât    ưt    oat   oăt   uât   uưt   ic    iêc   ec    ôc    --    uyêc  oec   uôc   ic          c     êc          yêc   
    _C  ang   ăng   âng   ưng   oang  oăng  uâng  uưng  inh   em    êng   ong   uynh  oem   uêng  ung   inh         nh    em    ynh   em    
    _D  ac    ăc    âc    ưc    oac   oăc   uâc   uưc   ich   ep    êc    oc    uych  oep   uêc   uc    ich         ch    ep    ych   ep    
    _E  anh   ơng   ơn    ơm    oanh  uơng  uơn   ương  ênh   êm    om    on    uênh  ôông  um    un                ênh   êm    ênh   ên    
    _F  ach   ơc    ơt    ơp    oach  uơc   uơt   ươc   êch   êp    op    ot    uêch  ôôc   up    ut                êch   êp    êch   êt

    BỔ SUNG 2021-10-2. Mình cập nhật bằng một phiên bản mới của mã B+. Nó là sản phẩm trung gian khi nghiên cứu phát triển một phiên bản thân thiện với phần cứng. Đối với phần mềm, nó không tốt hơn phiên bản trước, chỉ đẹp hơn. Xem Bảng 3d dưới.

    Bảng 3d (phiên bản 2021-10-1.) Các âm vần của mã B+.
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   
    ========================================================================================================================================
    _0  a     ơ     ơi    ư     oa    uơ    uơi   ưa    ô     e     eo    ôi    ua    oe    oeo   uôi               ô     e           e     
    _1  ao    au    âu    ưu    oao   oau   uâu   ươu   i     ia    ê     o     uy    uya   uê    u     i           --          y     ya    
    _2  ai    ay    ây    ưi    oai   oay   uây   ươi   iu    iêu   êu    oi    uyu   y     uêu   ui    iu                êu    yu          
    _3                                                                                                                                      
    _4                                                                                                                                      
    _5                                                                                                                                      
    _6                                                  inh   em    ênh   om    uynh  oem   uênh  um    inh         nh    em    ynh   em    
    _7                                                  ich   ep    êch   op    uych  oep   uêch  up    ich         ch    ep    ych   ep    
    _8  am    ăm    âm    ưm    oam   oăm   ươn   ương  im    iêm   êm    ôm    uym   oong  ôông  uôm   im          m     êm    ym          
    _9  ap    ăp    âp    ưp    oap   oăp   ươt   ươc   ip    iêp   êp    ôp    uyp   ooc   ôôc   uôp   ip          p     êp    yp          
    _A  an    ăn    ân    ưn    oan   oăn   uân   uưn   in    iên   ên    ôn    uyn   uyên  uên   uôn   in          n     ên    yn    yên   
    _B  at    ăt    ât    ưt    oat   oăt   uât   uưt   it    iêt   êt    ôt    uyt   uyêt  uêt   uôt   it          t     êt    yt    yêt   
    _C  ang   ăng   âng   ưng   oang  oăng  uâng  uưng  ing   iêng  êng   ông   --    uyêng uêng  uông  ing         ng    êng         yêng  
    _D  ac    ăc    âc    ưc    oac   oăc   uâc   uưc   ic    iêc   êc    ôc    --    uyêc  uêc   uôc   ic          c     êc          yêc   
    _E  anh   ơm    ơn    ơng   oanh  ươm   uơn   uơng  en    eng   on    ong   oen   oeng  un    ung               en    eng   en    eng   
    _F  ach   ơp    ơt    ơc    oach  ươp   uơt   uơc   et    ec    ot    oc    oet   oec   ut    uc                et    ec    et    ec

    Thay cho lý giải, mình tóm tắt thuật toán giải mã. Nhắc lại quy ước mặc định, khi giải mã, mã p/q của mã nguồn (chẳng hạn C+) chính là p của mã đích (B+). Phép giải mã p/q -> p do đó là phép đồng nhất. Biến đổi chỉ là hình thức, thực tế nó không làm gì cả. Chỉ có p/q -> q mới phát sinh hành động (tính toán) mà thôi.

    Hàm giải mã là một switch có 32 case ứng với 32 giá trị của mã phụ âm đầu. Trong đó, trong các case sau đây, phép giải mã có một phần khác với phép đồng nhất trên mã phụ âm đầu. Nó áp dụng khi mã âm vần rơi vào khoảng [81,AD].
    • case g/gh: ánh xạ g/gh thành gh.
    • case ng/ngh: ánh xạ ng/ngh thành ngh.

    Và trong các case sau đây, phép giải mã có một phần khác với phép đồng nhất trên mã âm vần.
    • case gi: ánh xạ cột 8_, 9_ sang 12_, 13_. Ví dụ, gi-iễu -> gi-ễu.
    • case y: ánh xạ cột 9_ sang 13_. Ví dụ, y-yêu -> y-êu (2).
    • case q: ánh xạ cột 8_, 9_, C_, D_ sang 10_, 11_, 14_, 15_ và ánh xạ mọi cột k còn lại sang cột k XOR 4. Ví dụ, q-ít -> qu-ít, q-uýt -> qu-ýt, q-uốc -> qu-ốcq-uăn -> qu-ăn (3).


    Giống như [#59], mũi tên q -> qu thuộc về ánh xạ đồng nhất trên mã phụ âm đầu: mã qu của B+ chính là mã q của C+ (4).

    Để thay đổi cho đỡ chán, lần này, cột trống là 11_. Muốn tiết kiệm 16 byte, phải hoán vị các cột theo từng đôi, đưa cột trống về vị trí 15_. Cố nhiên, sao cho vẫn giải mã được bằng phép XOR, vẫn tương dung với UTF-8, và vẫn giữ gọn tập mã âm vần thuộc 4 dạng đáng quan tâm [#61], đặc biệt là dạng thứ nhất. Hoán vị cột 3_, 7_ với cột B_, F_ chẳng hạn bảo toàn tính khả giải nhưng phá vỡ tính tương dung. Hoán vị cột 8_, 9_, 10_, 11_ với cột C_, D_, 14_, 15_ chẳng hạn bảo toàn tính khả giải và tính tương dung nhưng làm mất đi tính gọn. Chi tiết, xin nhường lại cho bạn đọc (5).

    Cuối cùng, so sánh mã B+ (Bảng 3d) phiên bản "vương đạo" này với mã B++ (Bảng 3g) của phiên bản "vương đạo" cũ [#59], ta thấy đã bớt đi 3 âm vần, là yêu, yêmyêp. Tương ứng, mã A3, so với mã A4 của phiên bản ấy vốn có 230 ký tự, đã bớt đi 3 ký tự (6). Vậy, nó khả thi.

    Phiên bản này tuy theo "chính đạo" nhưng hữu hiệu không kém "tà đạo" một chút nào.

    Phiên bản này làm theo "vương đạo" [#59], vốn chỉ cho phép theo sau chữ cái q là chữ cái u trong vai trò âm đệm. Nghĩa là không thể mã hóa các chữ có dạng qx ngoài dạng quy, với y là một âm vần có đôi và không có âm đệm. Nó không mã hóa được các chữ q, qa, qềnh, qống, qỷ,... thậm chí qùm, qũng, và nó gây tranh cãi cho cả chữ qu, nói riêng, cho từ qu'ran (7). Nói cách khác, giả thiết của nó là một mô hình chính tả (một thứ chữ Việt được lý tưởng hoá) gắn chặt một âm đầu với một âm đệm, vốn thuộc âm vần (theo quan điểm "qờ-ua-qua-sắc-quá" chính thống). Mô hình như thế đánh mất tính trực giao [#35] và, hệ quả, "vương đạo" [#59] không tổng quát bằng "bá đạo" [#58] hay "tà đạo" [#61]. Nói riêng, phiên bản này không tổng quát bằng phiên bản trước [#62]. Tuy nhiên, tính hữu dụng thực tế không suy suyển. Các chữ bị mất ấy đều không đáng kể. Chúng chưa bao giờ và mình không nghĩ sẽ có bao giờ phổ biến trong tiếng Việt. Vì lẽ đó, mình vẫn đánh giá phiên bản này nói riêng và "vương đạo" nói chung là tiến bộ, thành công.




    ______________
    (1) Bộ nhớ (mảng) là không cần thiết để giải mã ASCII, nói riêng, để tính to_upper hay to_lower, nhưng cần thiết chẳng hạn để dịch mã ASCII, nói riêng, dịch kết quả của to_upperto_lower, sang mã khác.

    (2) Nếu cần mã hoá cả chữ yx, có thể gán cho mã âm vần ix/uix một giá trị thứ ba, là yx, phân định bởi mã phụ âm đầu y. Và khi ấy, case y ánh xạ cột 8_, 9_ sang 12_, 13_. Ví dụ, y-ynh -> y-nh, y-yêu -> y-êu.

    (3) Trong case q, xét nghiệm cho dạng thứ tư [#61] được thay thế bằng xét nghiệm cho dạng ix/uix, uyx. Do mỗi case chỉ được phép làm nhiều nhất 1 xét nghiệm, hàm giải mã không thể (không được phép, dẫu có sức) phân biệt giữa 2 dạng x,wx. Hệ quả, chẳng hạn, q-oa/ua -> qu-a -> q-u-a (đúng) và q-a -> qu-oa -> q-u-oa (sai). Vậy, theo "vương đạo" thì (chẳng hạn) mã hóa được chữ qua nhưng không mã hóa được chữ qa.

    (4) Thật ra, có thể đổi tên mã số q thành qu trong cả mã C+, D+, v.v. Nhưng làm thế sẽ đánh mất cơ sở chung để đối chiếu, so sánh, đánh giá các phương án, phiên bản khác nhau. Vả lại, làm thế phải chữa nhiều bài đã viết từ lâu. Không những luật q-uy -> qu-y phải chữa thành qu-uy -> qu-y và thí dụ q-uân -> qu-ân phải chữa thành qu-uân -> qu-ân, mà còn phải chữa cả bảng mã, hoặc thêm phiên bản mới, thậm chí mã mới chỉ để xử lý chuyện "màu mè" hình thức. Trong cách trình bày của mình, một phép biến đổi dữ liệu nhỏ nhất cũng đẻ ra một mã! Dù không làm thế, cũng phải thừa nhận các luật và thí dụ viết theo "cách mới" kia cũng có một điểm hay. Chúng cho thấy rõ ở "vương đạo", mã qu rất giống 2 mã đặc biệt còn lại (giy).

    (5) Nên cân nhắc. Hàm giải mã nên là hàm toàn phần, nghĩa là miền xác định nên chứa mọi mã số chứ không chỉ những mã số hợp lệ. Miền giá trị của phép XOR bao hàm cả cột 15_ sau hoán vị (tức 11_ hiện thời) nơi ẩn chứa kết quả giải mã những mã số bất hợp lệ nhất định, ví dụ q-ia, q-iêm. Bỏ cột ấy đi là rút ngắn mảng, làm cho chỉ số mảng rơi ra ngoài mảng, sinh hành tung bất định, nếu chẳng may mã số như thế có mặt trong bản mã. Vậy, cột 15_ dẫu bỏ trống vẫn là chi phí không gian trả thay cho chi phí thời gian kiểm tra dữ liệu (đầu vào hoặc đầu ra). Dù sao, phiên bản này cũng hơn phiên bản trước là đã cho phép hoán vị. Thế là cũng đã làm được một việc tốt, như ASCII đã làm nửa thế kỷ trước. Trả lại người dùng quyền chọn. Khi thấy không cần chi phí, người dùng có thể chọn không chi.

    (6) Các mã B, B+ (A3, A3') và B++ (A4, A4') được đặt tên, nhất quán từ đầu đến giờ, dựa theo điểm khác biệt cơ bản của chúng. Điểm khác biệt ấy là cách giải mã iêu/yêu (của mã V, D, C,....) khi theo sau mã gi và mã -- (hoặc y). Trong B nó trở thành iêuyêu. Trong B+ nó trở thành êu. Còn trong B++ nó trở thành êuyêu. Do đó, hai mã dẫu rất khác nhau nhưng vẫn có thể được giới thiệu dưới cùng một tên, chỉ phân biệt ở số hiệu phiên bản và, ngược lại, dẫu rất giống nhau nhưng vẫn có thể được giới thiệu dưới hai tên phân biệt. Mã B+ (A3) ở đây rất khác phiên bản trước của nó [#62] mà lại rất giống mã B++ (A4) "đồng đạo" của nó [#59].

    (7) Chữ qu có thể mã hoá bằng q-- ở phiên bản này. Song, cũng như quít mã hoá bằng q-ít, cách ấy xem ra vô lý. Chữ qu đáng lý ra phải mã hoá bằng q-u và để làm được thế theo "vương đạo", âm vần u phải cặp đôi với âm vần --, thành một đôi (x,wx) với x--, wu. Đi theo hướng này, ngoài rắc rối về học thuật (w là phụ âm còn u trong chữ qu của từ qu'ran là nguyên âm) sẽ còn gặp phải rắc rối về kỹ thuật: u là âm mở còn -- là âm [nửa] khép. Rắc rối kỹ thuật có thể gỡ, chẳng hạn, bằng cách hoán vị u với ô, ua hay y để cho u lấy chỗ ở một cột cho phép ánh xạ nó thành -- ở đâu đó cuối bảng. Phiên bản 2021-9-24 [#61,#62], hiện thân của "tà đạo", cũng gợi mở một đường gỡ rối kỹ thuật khác cho phiên bản 2021-9-27 này: có thể định nghĩa âm vần trống là [nửa] mở và gán cho nó một mã số cặp đôi với u, chẳng hạn, bằng cách dời âm vần trống về ô 0xB1, đẩy chủ nhân hiện thời (âm vần o) sang một ô nào đó trong nửa hàng còn bỏ trống của mã D+. Nhưng có cơ sở học thuật nào để làm thế hay không, mới là vấn đề. Có quá ít lợi ích và quá nhiều chi phí (nghiên cứu) để giải quyết thoả đáng chữ qu và/hoặc bất cứ chữ nào có dạng qx ngoài dạng quy trong khuôn khổ của "vương đạo". Ai cần chúng, hãy theo "bá đạo".
    Đã được chỉnh sửa lần cuối bởi Ada : 16-10-2021 lúc 04:50 PM. Lý do: Thêm phiên bản 2021-10-1
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  4. #64
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    996

    Nếu mình muốn viết một trình soạn thảo tiếng Việt (cụ thể một cửa sổ soạn thảo) trên Windows (w10) thì theo Ada mình nên áp dụng bảng mã trong #X cho phù hợp...?

  5. #65
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    Nếu mình muốn viết một trình soạn thảo tiếng Việt (cụ thể một cửa sổ soạn thảo) trên Windows (w10) thì theo Ada mình nên áp dụng bảng mã trong #X cho phù hợp...?
    #X là gì thế MHoang?

    Tùy theo bạn có định dùng lại code cũ hay không. Nếu tận dụng code cũ, UTF-16 là lựa chọn hiển nhiên. Nếu định viết code mới tinh, UTF-8 là xu hướng nên theo.

    Mã của mình chỉ thích hợp cho dữ liệu lớn. Chẳng hạn, một ứng dụng CSDL. Thay vì lưu string tiếng Việt (để hiển thị) trong 1 trường dữ liệu và chuỗi trọng số của nó (để tìm kiếm) trong 1 trường chỉ mục, có thể lưu 1 bản, trong 1 trường thôi, bằng mã của mình.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  6. #66
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    996

    Mặc định một phương pháp mã hóa tiếng Việt

    #X là ý muốn nói tới mục nào trong đề tài này, cái bạn đang đọc đây là #66, mình cần tốc độ theo thời gian thực không cần xử lý dữ liệu quá lớn (quy ra dữ liệu khoảng 10000 bản ghi đổ lại). Mình sẽ xem thêm.

    .

  7. #67
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Tốc độ theo thời gian thực, ý bạn nói có phải là chẳng hạn người dùng gõ thêm 1 phím thì máy tính phải tìm kiếm và hiển thị những từ liên quan để gợi ý cho người dùng? Như vậy là cũng tìm kiếm mạnh. Nhưng 10k bản ghi là ít, không cần mã hóa đặc biệt gì đâu.

    Còn trong các phiên bản của mình, phiên bản cuối [#63] là tốt hơn cả và mình nghĩ là đã hoàn thiện. Có thể khuyên dùng trong mọi trường hợp cần mã hóa.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  8. #68
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Chu choa! Mình cứ ngỡ mã hóa được thêm chữ qui để cho người dùng thêm thoải mái tý thôi [#57]. Nào ngờ qui hay quy là chuyện to thế:

    Quy Nhơn hay Qui Nhơn?

    Vì sao đổi tên thành phố Qui Nhơn thành Quy Nhơn?

    Qui Nhơn hay Quy Nhơn là đúng tên đơn vị hành chính?
    Đã được chỉnh sửa lần cuối bởi Ada : 15-10-2021 lúc 08:39 AM. Lý do: Sửa link cho tử tế
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  9. #69
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Còn rất nhiều thứ cần làm và đáng làm nhưng chủ đề này đã quá dài. Mình dừng ở đây. Các việc còn lại, mình sẽ mở chủ đề khác. Kết quả cập nhật năm nay, mình đã tự đánh giá trong các bài trước cả rồi. Bài này dành để trình bày chi tiết phương án hay nhất. Đó là "đế đạo" [#60].

    Nhưng trước hết, xin nói 1 câu về kỹ thuật đánh giá. Các con số không biết nói dối, chỉ hiềm là đôi khi chúng ta không biết đọc số cho đúng mà thôi. Theo thống kê, tỷ lệ tử vong của Mỹ trong các năm từ 2015 đến nay lần lượt là 84, 85, 86, 87, 88, 89 nhân mạng/10 nghìn dân. Nếu xem tỷ lệ tử vong mỗi năm thêm 1 mạng ấy là do một nhân tố X nào đó chưa biết chứ không phải là ngẫu nhiên, do X != COVID, kết luận đúng, dẫu khó tin, là số người Mỹ chết vì COVID trong năm 2020 không đáng kể (1).

    Theo Bảng 1 [bài #2], có 34 phụ âm đầu, trong đó 1 không có chữ cái nào (--), 22 có một chữ cái (c, b, d, đ, f, g, h, j, k, l, m, n, p, q, r, s, t, v, w, x, y, z), 10 có hai chữ cái (ch, dz, gh, gi, kh, ng, nh, ph, th, tr) và 1 có ba chữ cái (ngh). Nếu chúng được sắp lại theo thứ tự tăng dần của độ dài, thì độ dài của một phụ âm đầu P nào đó với mã số p

    Code:
    (0 < p) + (22 < p) + (32 < p)
    Cần phải làm bao nhiêu phép tính để tính được giá trị biểu thức trên? Hỏi rõ ngớ ngẩn, 5 phép tính chứ còn bao nhiêu nữa (3 phép so sánh và 2 phép cộng). Câu hỏi của mình sẽ bớt "ngớ ngẩn" đi nếu xem xét biểu thức như thế với nhiều số hạng hơn, chẳng hạn:

    Code:
    (a_1 < p) + (a_2 < p) + (a_3 < p) + ... + (a_128 < p)
    Học sinh tiểu học nào đã từng giải bài toán "tìm đồng xu giả lẫn trong các đồng xu thật bằng một cái cân đòn" cũng biết không cần làm đến 255 phép tính. Mình chỉ còn nhớ được nó cỡ log(128), nhưng cái "log(128)" ấy chính xác là bao nhiêu thì mình không biết. (Mong ai đó có thể bổ túc cho mình bằng một đáp số chính xác.)

    Như vậy, để xét nghiệm một số có thuộc về một tập trị S nào đó hay không, nếu S gọn (S là 1 khoảng) thì tốt nhất, nhưng nếu S không gọn, cụ thể, S có 2^n khoảng rời nhau rải rác khắp nơi, thì cũng không có vấn đề gì to tát cả. Số phép tính bất quá cũng chỉ tăng lên gấp n lần mà thôi.

    Nếu có thể coi "bá đạo" nhằm tốc độ (độ trễ, tính bằng số xung nhịp) thì "đế đạo" có thể coi là nhằm kích cỡ (bộ nhớ, tính bằng bit). Nó đi đến đích ấy bằng cách khai thác triệt để trật tự ngữ âm. Dẫu biết làm thế là đôi khi phải bỏ qua trật tự chính tả. Nghĩa là phải hy sinh tính gọn của vài tập trị nào đó.

    Thuật toán giải mã có thể cài đặt mô phỏng bằng phần mềm và "bộ nhớ" khi ấy bao gồm cả mã lệnh và dữ liệu. Nhưng để đánh giá đúng thì không nên tính như thế. Chỉ tính dữ liệu thôi. Lý do là khi cài đặt (mô phỏng) bằng phần mềm, những tính toán phức tạp, gồm nhiều nhánh if...else..., sinh rất nhiều mã lệnh so với kích cỡ bảng (mảng), nhưng khi cài đặt (thực thi) bằng phần cứng (vi mạch), các tính toán phức tạp, gồm nhiều phép tính AND, OR, XOR, NOT,... cũng vẫn sinh rất ít gate, chả đáng là bao so với kích cỡ bảng (mảng).

    Giải mã "đế đạo" phức tạp hơn "vương đạo" và "bá đạo". Tính phức tạp ấy phản ánh tự nhiên tính tinh vi của mô hình âm tiết truyền thống [2] so với mô hình âm tiết chính thống [#2] và, do đó, tính rắc rối của phép biến đổi giữa hai mô hình này khi được dùng để mã hóa [#60]. Trình bày lần này, để trực quan hơn, mình giải mã C* thẳng ra mã A2 (2), tô điểm định dạng thường lệ của bảng mã C* bằng kết quả trong A2 và giá trị từng byte của bộ nhớ ROM dùng cho phép giải mã ấy (3).

    Nhắc lại, trong mã A2, mỗi âm vần là một xâu 2 ký tự. Để giảm bộ nhớ, ở đây, ký tự đầu được xác định bằng tính toán, chỉ có ký tự sau là tra bảng mà thôi. Nhờ thế, mỗi phần tử của mảng âm vần chỉ còn 1 byte.

    Nói rõ hơn, năm lớp âm vần ox, ux, ưx, ix, yx là xâu 2 ký tự trong mã A2 hiện thời và, bây giờ, cả lớp âm vần ôx cũng thế (4). Hàm giải mã sẽ phải dùng cấu trúc điều khiển if...else..., switch...case..., biểu thức có điều kiện hoặc mạch điện tử tương đương để tính ra ký tự o, ô, u, ư, i, y, còn bảng (mảng) chỉ dùng để tra ký tự x (tức ký tự thể hiện xâu x của các chữ cái Việt), cũng như ký tự duy nhất ở sáu lớp âm vần còn lại, là ax, ăx, ex, êx, ơx, âx (Bảng 15).



    Bảng 15. (Phương án có tính minh hoạ) 192 âm vần của mã C* đã được giải ra mã A2. Ví dụ, 0x00 là ao trong C* và được giải ra ao trong A2 (tức 1 ký tự, với mã số nào đó), 0x50 là ua trong C* và giải ra u-a (tức một xâu 2 ký tự), 0x80 là oao/uao trong C* và giải ra o-ao/u-ao (tức một xâu 2 ký tự với 2 giá trị khả dĩ chỉ khác nhau ở ký tự đầu), 0x30 là iu/uiu trong C* và giải ra i-u/u-iu (tức một xâu 2 ký tự với 2 giá trị khả dĩ khác nhau ở cả ký tự cuối). Ở dòng thứ ba của mỗi ô là 1 byte của mảng giải mã âm vần, thường là ký tự duy nhất hoặc giá trị duy nhất (nếu có) của ký tự thứ hai của mã số (A2). Để đỡ rối mắt, bảng chỉ hiển thị những byte bất quy tắc (khác thường lệ đó). Ví dụ, mảng[0x00] = ao, mảng[0x50] = a, mảng[0x70] = --, mảng[0x80] = ao và mảng[0x30] = iu.
    Code:
        0_     1_     2_     3_     4_     5_     6_     7_     8_     9_     A_     B_     
    ========================================================================================
    _0  ao     eo     âu     i-u    ư-u    u-a    ư-ơu   ô--    o-ao   o-eo   u-âu   u-yu   
                             u-iu                               u-ao   u-eo                 
                             iu                                                             
    ----------------------------------------------------------------------------------------
    _1  ai     e      ây     i--    ư--    u-ôi   ư-ơi   ô-i    o-ai   o-e    u-ây   u-y    
                             u-i                                u-ai   u-e                  
                             i                                                              
    ----------------------------------------------------------------------------------------
    _2  am     em     ân     i-m    ư-m    u-ôm   ư-ơm   ô-m    o-am   o-em   u-ân   u-ym   
                             u-im                               u-am   u-em                 
                             im                                                             
    ----------------------------------------------------------------------------------------
    _3  ap     ep     ât     i-p    ư-p    u-ôp   ư-ơp   ô-p    o-ap   o-ep   u-ât   u-yp   
                             u-ip                               u-ap   u-ep                 
                             ip                                                             
    ----------------------------------------------------------------------------------------
    _4  an     en     ư-n    i-n    i-êm   u-ôn   ư-ơn   ô-n    o-an   o-en   u-ưn   u-yn   
                             u-in   y-êm                        u-an   u-en                 
                      ưn     in     n                                                       
    ----------------------------------------------------------------------------------------
    _5  at     et     ư-t    i-t    i-êp   u-ôt   ư-ơt   ô-t    o-at   o-et   u-ưt   u-yt   
                             u-it   y-êp                        u-at   u-et                 
                      ưt     it     t                                                       
    ----------------------------------------------------------------------------------------
    _6  ang    eng    ư-ng   i-nh   ô-ông  u-ông  ư-ơng  ô-ng   o-ang  o-eng  u-ưng  u-ynh  
                             u-inh                              u-ang  u-eng                
                      ưng    inh    nh                                                      
    ----------------------------------------------------------------------------------------
    _7  ac     ec     ư-c    i-ch   ô-ôc   u-ôc   ư-ơc   ô-c    o-ac   o-ec   u-ưc   u-ych  
                             u-ich                              u-ac   u-ec                 
                      ưc     ich    ch                                                      
    ----------------------------------------------------------------------------------------
    _8  au     êu     ơ      a      y--    i-êu   o--    u--    o-au   u-êu   u-ơ    o-a    
                                           y-êu                 u-au                        
                             a                                                              
    ----------------------------------------------------------------------------------------
    _9  ay     ê      ơi     i-a    ư-i    ư-a    o-i    u-i    o-ay   u-ê    u-ơi   u-ya   
                                                                u-ay                        
                             ia                                                             
    ----------------------------------------------------------------------------------------
    _A  ăm     êng    âng    i-êng  i-ng   ơm     o-m    u-m    o-ăm   u-êng  u-âng  u-yêng 
                             y-êng  u-ing                       u-ăm                        
                             iêng   ing                                                     
    ----------------------------------------------------------------------------------------
    _B  ăp     êc     âc     i-êc   i-c    ơp     o-p    u-p    o-ăp   u-êc   u-âc   u-yêc  
                             y-êc   u-ic                        u-ăp                        
                             iêc    ic                                                      
    ----------------------------------------------------------------------------------------
    _C  ăn     ên     ơn     i-ên   o-ong  êm     o-n    u-n    o-ăn   u-ên   u-ơn   u-yên  
                             y-ên                               u-ăn                        
                             iên                                                            
    ----------------------------------------------------------------------------------------
    _D  ăt     êt     ơt     i-êt   o-oc   êp     o-t    u-t    o-ăt   u-êt   u-ơt   u-yêt  
                             y-êt                               u-ăt                        
                             iêt                                                            
    ----------------------------------------------------------------------------------------
    _E  ăng    ênh    ơng    anh    --     âm     o-ng   u-ng   o-ăng  u-ênh  u-ơng  o-anh  
                                                                u-ăng                       
                                    ng                                                      
    ----------------------------------------------------------------------------------------
    _F  ăc     êch    ơc     ach    --     âp     o-c    u-c    o-ăc   u-êch  u-ơc   o-ach  
                                                                u-ăc                        
                                    c                                                       
    ----------------------------------------------------------------------------------------


    Bảng mã C* lần này đã cập nhật một tý so với phiên bản ban đầu [#60].

    Bảng âm vần có 192 ô, nhưng mảng âm vần không cần đến 192 byte. Nó đã được sắp xếp sao cho có thể cắt bỏ đoạn cuối (nghĩa là sao cho bất cứ ký tự nào trong đoạn ấy cũng đều tính được), từ 0x62 = 98 trở đi, nên thực tế chỉ còn 98 byte.

    Nhắc lại, trong mã A2, mỗi phụ âm đầu là một xâu 2 ký tự. Tuy vậy, tương tự trên, phụ âm đầu cũng có thể giải mã với một mảng có ít hơn 32 phần tử và mỗi phần tử có ít hơn 2 ký tự (byte). Chẳng hạn, với các phụ âm đầu được xếp đặt lại như Bảng 16 (cảnh báo: đây là "tà đạo",) dễ tìm được một công thức giải mã (tính được cả 2 ký tự) bằng một mảng như Hình 17, vốn chỉ có 23 byte.



    Bảng 16. (Phương án có tính minh họa) 32 phụ âm đầu của mã C* đã giải ra mã A2. Ví dụ, 1 là b trong C* và được giải ra b trong A2 (tức 1 ký tự, với một mã số nào đó); 0x1C là ng/ngh trong C* và được giải ra n-g trong A2 (tức một xâu có 2 ký tự); 0x14 là g/gh trong C* và được giải ra g/g-h trong A2 (tức một xâu có hai giá trị khả dĩ và có lần lượt 1, 2 ký tự).
    Code:
        _0   _1   _2   _3   _4   _5   _6   _7   _8   _9   _A   _B   _C   _D   _E   _F 
    ==================================================================================
    0_  --   b    đ    f    h    j    l    m    q    s    v    w    x    y    c    k  
    
    1_  p    n    t    d    g    r    z    c-h  k-h  p-h  n-h  t-h  n-g  t-r  d-z  g-i
                            g-h

    Hình 17. Mảng byte phụ trợ giải mã phụ âm đầu từ C* ra A2 theo Bảng 16. Mỗi phần tử (byte) là một ký tự của mã A2.
    Code:
    b  đ  f  h  j  l  m  q  s  v  w  x  y  c  k  p  n  t  d  g  r  z  i


    Không cần phải tốn byte nào cho độ dài phụ âm đầu. Độ dài có thể tính theo công thức ở đầu bài này. Vì âm đầu chỉ có không hơn 2 ký tự, công thức đó chỉ còn 3 phép tính (5).

    Vậy, tiêu dùng bộ nhớ hết thảy là 98 + 23 = 121 byte.

    Chỉ còn một vấn đề nữa thôi. Mảng 98 byte trên không hề có ký tự yu, chỉ có iu và, nói chung, không hề có các ký tự dạng yx mà chỉ có biến thể ix của nó. Ta biết rằng tương phản với các mã C*, B+, A3,... trong các mã tự điển A2, A3',... không có quan hệ số học - luận lý nào giữa hai ký tự, nói riêng, giữa ix,yx, ngoại trừ quan hệ thứ tự tầm thường, như ix < yx. Thế thì chuỗi tính toán giải mã uyu -> uiu -> u-iu -> u-yu chẳng hạn, tài nào làm được?

    Dễ thôi. Không có quan hệ nào thì ta sẽ tạo ra quan hệ.

    Mã A2 hiện có 121 ký tự [#57]. Thêm 7 ký tự ia, iêc, iên, iêng, iêt, yc, yng nữa, nó sẽ có 121 + 7 = 128 ký tự, vẫn nằm trong ngân sách 7 bit. Hình 18 chỉ ra vị trí 7 ký tự mới trong bảng ký tự, qua đó gợi ra một hệ thức mới hình thành ở từng đôi ký tự (ix,yx), độc lập với x, tương tự như hệ thức ở từng đôi chữ cái viết thường và viết hoa trong bảng ASCII. Bảy ký tự mới được dùng làm trung gian giải mã, nhưng không xuất hiện trong mã số đã giải xong. Theo nghĩa này, vị trí của chúng trong bảng ký tự có thể xem như bỏ trống. Bảng 19 liệt kê đủ 128 ký tự.

    Hình 18. Hai đoạn trích bảng ký tự của mã A2 đã bổ sung 7 ký tự, cụ thể, đoạn ix và đoạn yx. Giá trị 7 ký tự mới thêm được hiển thị bằng các dấu - để ngụ ý 7 vị trí đó xem như bỏ trống.
    Code:
    i,--,ic,ich,---,---,----,---,im,in,ing,inh,ip,it,iu
    y,ya,--,ych,yêc,yên,yêng,yêt,ym,yn,---,ynh,yp,yt,yu
    Giờ đây, ta có thể làm phép biến đổi ký tự ix -> yx bằng một phép tính, tương tự như phép biến đổi to_lower của ASCII. Đó là phép tính gì, xin để cho bạn đọc tự tìm.


    Bảng 19. Bảng ký tự mã A2, phiên bản mới. Bảy vị trí đánh dấu bằng --- là 7 ký tự mới. Hai ký tự ôông, ôôc đã được loại bỏ (6). Hai chỗ trống để lại đã di chuyển về 0x07 và 0x2B để align hai cặp (ang,anh), (êc,êch) và mọi cặp khác tương tự, nhằm tạo thuận lợi cho một phép biến đổi ký tự có tiềm năng sử dụng (7).
    Code:
         0_   1_   2_   3_   4_   5_   6_   7_   
    =============================================
    _0   --   ăm   d    êng  im   ong  ơt   y    
    _1   a    ăn   đ    ênh  in   ô    ơu   ya   
    _2   ac   ăng  e    êp   ing  ôc   p    ---  
    _3   ach  ăp   ec   êt   inh  ôi   q    ych  
    _4   ai   ăt   em   êu   ip   ôm   r    yêc  
    _5   am   âc   en   f    it   ôn   s    yên  
    _6   an   âm   eng  g    iu   ông  t    yêng 
    _7        ân   eo   h    j    ôp   u    yêt  
    _8   ang  âng  ep   i    k    ôt   ư    ym   
    _9   anh  âp   et   ---  l    ơ    ưc   yn   
    _A   ao   ât   ê    ic   m    ơc   ưn   ---  
    _B   ap   âu        ich  n    ơi   ưng  ynh  
    _C   at   ây   êc   ---  ng   ơm   ưt   yp   
    _D   au   b    êch  ---  nh   ơn   v    yt   
    _E   ay   c    êm   ---  o    ơng  w    yu   
    _F   ăc   ch   ên   ---  oc   ơp   x    z


    "Quái chiêu" vừa rồi cũng là "chiêu" cuối, để cho chủ đề này một cái kết đẹp.







    ____________________
    (1) Không có ý xem thường COVID. Mình biết nó rất nguy hiểm và mình đã tiêm vắc-xin.

    (2) Thay đổi chỉ ở cách thực hiện thuật toán, chứ thuật toán không thay đổi. Người thực hiện vẫn chọn cách mã hoá và tuỳ theo cách ấy, vẫn chọn cách giải mã, với các mã trung gian đã được trình bày trước đây. Đơn cử, người thực hiện vẫn có 2 lựa chọn cho chữ yêu là mã hóa bằng --yêu hoặc bằng y-yêu và, nếu chọn cách sau, thì trình tự giải mã (trong ý niệm) vẫn là C* -> B+ -> A3 -> A2, qua đó, nói riêng, mã âm vần iêu/yêu giải ra êu (thay vì y-êu) khi phụ âm đầu là y và giải ra êu (thay vì i-êu) khi phụ âm đầu là gi.

    (3) Cấu trúc dữ liệu trong suốt loạt bài này là một đồ thị có hướng không chu trình, nhưng đã cụ thể hóa (để tối ưu hóa) đến mức thấp nhất, là một mảng. Song, ngay cả cấu trúc cụ thể này cũng chỉ nhằm minh hoạ tư tưởng và phương pháp. Mảng có thể xếp đặt theo nhiều cách khác nhau, cho những chi phí thời gian và bộ nhớ khác nhau.

    (4) Năm lớp ix, yx, ưx, ux, ox khởi phát từ các âm vần có âm đệm (wx) và âm vần có nguyên âm đôi (w, ươw, y). Lớp ôx được thêm vào đó do tương tự lớp ox.

    (5) Và chỉ tốn 2 xung nhịp. Trong suốt loạt bài, tiêu chí thời gian chạy là cho trường hợp xấu nhất.

    (6) Thật ra, mã A2 không cần đến 128 ký tự. Nó đã hơi khác phiên bản cũ [#57]: lớp âm vần ôx giờ không còn là một ký tự mà là là một xâu, cụ thể, xâu ô-x. Nói riêng, ôông được mã hóa bằng ô-ông và tương tự, ôôc bằng ô-ôc. Ký tự ôông, ôôc do đó trở thành thừa. Hai chỗ trống có thể cho người cài đặt nhiều tự do hơn và Bảng này là ví dụ.

    (7) Ngoài ra, bảng ký tự của mã A2 (và nói chung, bất cứ mã nén hậu tố nào có bảng ký tự theo thứ tự từ điển) còn có đặc điểm là với xâu chữ cái a bất kỳ, hai ký tự có dạng ac, ach, nếu có, đi liền nhau trong bảng ký tự và hai ký tự ang, anh cũng thế. Quan hệ đó cho một phép biến đổi ký tự có tiềm năng sử dụng, dẫu chưa được dùng, là (ang,ac) -> (anh,ach).
    Đã được chỉnh sửa lần cuối bởi Ada : 14-10-2021 lúc 10:50 AM. Lý do: thêm bảng ký tự A2
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

  10. #70
    Ngày gia nhập
    01 2008
    Nơi ở
    Rất đông người
    Bài viết
    742

    Một xét nghiệm với tập trị "đẹp", tức khoảng [a,b) với a, b hai bội nguyên liên tiếp của một lũy thừa của 2 và, tổng quát, tập trị với số các trị là một lũy thừa của 2 và vét cạn mọi tổ hợp trị của một tập con các bit [#59], dùng hết 1 phép AND với hằng và 1 phép so sánh "bằng nhau" với hằng. Một xét nghiệm với tập trị tương đối "xấu", là 1 khoảng khác dạng đó, cũng chỉ dùng hết 1 phép trừ với hằng và 1 phép so sánh "nhỏ hơn hoặc bằng" hằng không dấu (1). Vậy, tạm nhắm mắt trước vấn đề bảo mật mà chỉ nhìn vào hiệu năng, hai xét nghiệm ấy hữu hiệu như nhau (trừ phi chạy trên máy tính IBM 704 lấy từ viện bảo tàng.) Đó là lý do của quyết định thiết kế "tà đạo" [#61] cũng như "chính đạo" mới [#63].

    Nghe cũng tuyệt đấy. Thế nhưng ấy là khi ta tạm nhắm mắt trước vấn đề bảo mật. Nếu ta thử mở mắt ra, thì sao nhỉ?

    Không một tay code nào dám nói chắc rằng hai xét nghiệm ấy có thời gian chạy bằng nhau.

    Và đến phiên bản cuối [#63], vẫn còn một xét nghiệm với tập trị "xấu". Đó là dạng thứ nhất [#61], cần thiết để phân định hai mã âm đầu lưỡng trị, g/ghng/ngh.

    Mã âm đầu ng/ngh chỉ được phân định khi giải mã toàn phần (để hiển thị); còn khi giải nén tiền tố (để so sánh), luôn giải thành ng bất kể âm vần nào theo sau [#24]. Ta tự hỏi liệu có thể áp dụng "quái chiêu" này cho g/gh hay không. Nếu làm được thế thì đẹp quá. Tuy không rút ngắn được mã nhưng nó đơn giản hoá việc giải mã, vì dạng âm vần thứ nhất không cần xét nghiệm nữa.

    Không may, câu trả lời là không. Trong chính tả, hai chữ dạng ngunghu loại trừ lẫn nhau nhưng hai chữ dạng gughu thì chung sống. (Ví dụ, ghì cùng tồn tại.) Cho nên thay thế mọi ngh bằng ng là song ánh từ chữ Việt đến "chữ Việt mới", nhưng thay thế mọi gh bằng g thì không. Phép thay thế đầu tạo ra một "chữ Việt mới" đẳng cấu (tương đương) với chữ Việt. Còn phép thay thế sau phá vỡ cấu trúc thứ tự [tự điển] của chữ Việt. Vậy, mã ng/ngh có thể diễn giải thành [duy nhất] chữ ng, nhưng mã g/gh không thể diễn giải thành [duy nhất] chữ g. Mặt khác, nó cũng không thể diễn giải thành [duy nhất] bất cứ chữ cái G != g nào. Bởi vì việc ấy nói nôm na là thay thế gh và cả g bằng G trong mọi chữ Việt ngoài dạng giu; để bảo toàn thứ tự, < đòi hỏi G <= g, nhưng < lại đòi hỏi g <= G. Muốn "trị" tính "bướng" của mã g/gh thì không có cách nào khác hơn là cấp cho ggh hai mã số phân biệt [#19, #28].

    Hẳn thế rồi, ai chả biết. Nhưng ta hãy thử hỏi khác đi một tý, hạ yêu cầu xuống thấp một tý. Có cách nào thay thế xét nghiệm mã âm vần dạng thứ nhất, vốn cần phải chính xác, bằng một xét nghiệm gần đúng [#61] hay không? Nếu làm được thế thì đẹp quá. Tập trị "xấu" S = [81,AD] sẽ được thay thế bằng một tập trị "đẹp" S' nào đó bao hàm S. Xét nghiệm cho case ng/ngh và cả case g/gh sẽ trở thành giống hệt mọi case khác về cách tính và, đương nhiên, thời gian chạy. Câu trả lời là, có đấy.

    Trong chính tả, các chữ dạng geo, u không tồn tại; chỉ có chữ dạng gix có thể cùng tồn tại với ghix mà thôi. Thế nên ta vẫn có thể đem "quái chiêu" cho mã ng/ngh áp dụng cho mã g/gh một cách gần giống: g/gh được giải ra g kể cả khi theo sau nó là eo, êu. Nói nôm na, giải nén tiền tố không giải ra chữ Việt mà giải ra một thứ "chữ Việt mới" với ghét, ghê,... được thay bằng gét, ,... Sự thay thế này không có tác động nào ngoài biến khoảng [ghe,ghêu] thành khoảng [ge,gêu], chen giữa chúng không có chữ Việt nào, nên bảo toàn thứ tự [tự điển]. Bạn đọc nên tự tìm nốt các chi tiết còn lại của chứng minh, giống như [#24].

    Chỉ khi theo sau g/ghix, bên cạnh giải mã g/gh ra g (2), ta mới cần làm thêm một phép biến đổi nữa. Bồi thêm một "chiêu" nữa. Không phải "quái chiêu" gì, mẫu mực thôi. Giải ix ra hix.

    Nói hình thức, mã B+, B++ bây giờ không còn mã gh, chỉ còn g. Và phép giải mã C+, C* ra B+, B++ chỉ còn 1 mũi tên g/gh -> g, vốn là mặc định, không phát sinh hành động. Bù lại, mã B+, B++ có thêm các mã âm vần có dạng hix và tương ứng, chúng trở thành các ký tự trong mã A3, A4. Trong mã A3, A4 trước đây, sau tiền tố g, lớp hậu tố hy được mã hóa bằng xâu 2 ký tự h-y, với ký tự y có dạng eo, êu, ix. Trong mã A3, A4 bây giờ, sau tiền tố g, phát sinh hai lớp hậu tố eo, êu; chúng chỉ đổi tiền tố (từ gh sang g) còn bản thân vẫn được mã hóa như cũ (bằng 1 ký tự) và như thế đương nhiên vẫn nhất quán [#25]; còn lớp hậu tố hy, nay chỉ còn là hix, được mã hóa theo cách mới (bằng 1 ký tự) (3) và như thế, vẫn nhất quán. Lớp chữ gz do đó vẫn được mã hóa nhất quán. Vậy, sự thay đổi định nghĩa này duy trì tính chính quy của mã A3, A4 [#25, #28] và, vì thế, tính tự điển của mã A3', A4'.

    Tiếng Việt có ít nhất 5 chữ có dạng ghix, cụ thể, ghi, ghim, ghịt, ghiền, ghiếc, với 5 vần khác nhau. Nghĩa là mã B+, B++ sẽ phải có thêm ít nhất 5 âm vần và tương ứng, mã A3 (A3'), A4 (A4') sẽ phải có thêm ít nhất 5 ký tự.

    Song, người và đất mang tên Ghình cũng không hiếm. Vả lại, miền Nam có nơi phát âm r rất Pa-ri-diêng, có phần còn hơn người Pháp (4). Một nhà văn, nhà báo rất có thể miêu tả bản sắc của tiếng địa phương ấy không những bằng "con cá (rô)", "bỏ vô gổ (rổ)", mà còn bằng gột goẹt (rột roẹt), gổn gảng (rổn rảng), gón ghén (rón rén), ghếch gác (rếch rác),... (5) Thậm chí gâu ghia (râu ria), liu ghiu (liu riu), bịn ghịn (bịn rịn), ghình gang (rình rang), gúc ghích (rúc rích), xiêm ghiệp (xiêm riệp), gáo ghiết (ráo riết), ga ghiêng (ra riêng), v.v. (6)

    Vì thế, để có tính tổng quát, để giải mã được bất cứ chữ ghix nào, có bao ký tự dạng ix thì phải thêm bấy ký tự dạng hix. Và ký tự dạng ix (Bảng 7, Bảng 8) thì, eo ơi, xòe cả 2 bàn tay và 2 bàn chân mới đủ ngón để đếm! Những thứ "tà đạo" [#62], "bá đạo" [#58], do đã gần chạm ngưỡng 256 ký tự, không còn sức sử "chiêu" này. Chỉ có "vương đạo" [#59], "chính đạo" [#63] mới đủ sức mà thôi. Nhắc lại, mã A4 ở [#59] chỉ có 230 ký tự và mã A3 ở [#63] còn ít hơn, để dành một khoảng trống bao la.



    Bảng 8 (phiên bản 2021-10-16.) Bộ 248 ký tự của mã A4, A4', với 18 ký tự mới có dạng hix. Bỏ đi 3 ký tự yêm, yêp, yêu sẽ được phiên bản tương ứng của Bảng 7 -- bộ 245 ký tự của mã A3, A3'.
    Code:
    --    d     hiêp  m     oep   s     uơc   ươc   
    a     đ     hiêt  n     oet   t     uơi   ươi   
    ac    e     hiêu  ng    oi    u     uơn   ươm   
    ach   ec    him   nh    om    ua    uơng  ươn   
    ai    em    hin   o     on    uâc   uơt   ương  
    am    en    hing  oa    ong   uân   up    ươp   
    an    eng   hinh  oac   ooc   uâng  ut    ươt   
    ang   eo    hip   oach  oong  uât   uưc   ươu   
    anh   ep    hit   oai   op    uâu   uưn   ưp    
    ao    et    hiu   oam   ot    uây   uưng  ưt    
    ap    ê     i     oan   ô     uc    uưt   ưu    
    at    êc    ia    oang  ôc    uê    uy    v     
    au    êch   ic    oanh  ôi    uêc   uya   w     
    ay    êm    ich   oao   ôm    uêch  uych  x     
    ăc    ên    iêc   oap   ôn    uên   uyêc  y     
    ăm    êng   iêm   oat   ông   uêng  uyên  ya    
    ăn    ênh   iên   oau   ôôc   uênh  uyêng ych   
    ăng   êp    iêng  oay   ôông  uêt   uyêt  yêc   
    ăp    êt    iêp   oăc   ôp    uêu   uym   yêm   
    ăt    êu    iêt   oăm   ôt    ui    uyn   yên   
    âc    f     iêu   oăn   ơ     um    uynh  yêng  
    âm    g     im    oăng  ơc    un    uyp   yêp   
    ân    h     in    oăp   ơi    ung   uyt   yêt   
    âng   hi    ing   oăt   ơm    uôc   uyu   yêu   
    âp    hia   inh   oc    ơn    uôi   ư     ym    
    ât    hic   ip    oe    ơng   uôm   ưa    yn    
    âu    hich  it    oec   ơp    uôn   ưc    ynh   
    ây    hiêc  iu    oem   ơt    uông  ưi    yp    
    b     hiêm  j     oen   p     uôp   ưm    yt    
    c     hiên  k     oeng  q     uôt   ưn    yu    
    ch    hiêng l     oeo   r     uơ    ưng   z


    Thuật toán giải mã, theo [#63] chẳng hạn, đổi lại như sau.

    • case g/gh: ánh xạ cột 8_, 9_ sang 16_, 17_. Ví dụ, gh-im -> g-him.



    Bảng 3d (phiên bản 2021-10-16.) Các âm vần của mã B+
    Code:
        0_    1_    2_    3_    4_    5_    6_    7_    8_    9_    A_    B_    C_    D_    E_    F_    10_   11_   12_   13_   14_   15_   16_   17_   
    ====================================================================================================================================================
    _0  a     ơ     ơi    ư     oa    uơ    uơi   ưa    o     oi    ô     ôi    u     ui    ua    uôi               o     oi                o     oi    
    _1  ao    au    âu    ưu    oao   oau   uâu   ươu   i     ia    ê     e     uy    uya   uê    oe    i           --          y     ya    hi    hia   
    _2  ai    ay    ây    ưi    oai   oay   uây   ươi   iu    iêu   êu    eo    uyu   y     uêu   oeo   iu                êu    yu          hiu   hiêu  
    _3                                                                                                                                                  
    _4                                                                                                                                                  
    _5                                                                                                                                                  
    _6                                                  inh   om    ênh   ôm    uynh  um    uênh  uôm   inh         nh    om    ynh         hinh  om    
    _7                                                  ich   op    êch   ôp    uych  up    uêch  uôp   ich         ch    op    ych         hich  op    
    _8  am    ăm    âm    ưm    oam   oăm   ươn   ương  im    iêm   êm    em    uym   oong  ôông  oem   im          m     êm    ym          him   hiêm  
    _9  ap    ăp    âp    ưp    oap   oăp   ươt   ươc   ip    iêp   êp    ep    uyp   ooc   ôôc   oep   ip          p     êp    yp          hip   hiêp  
    _A  an    ăn    ân    ưn    oan   oăn   uân   uưn   in    iên   ên    en    uyn   uyên  uên   oen   in          n     ên    yn    yên   hin   hiên  
    _B  at    ăt    ât    ưt    oat   oăt   uât   uưt   it    iêt   êt    et    uyt   uyêt  uêt   oet   it          t     êt    yt    yêt   hit   hiêt  
    _C  ang   ăng   âng   ưng   oang  oăng  uâng  uưng  ing   iêng  êng   eng   --    uyêng uêng  oeng  ing         ng    êng         yêng  hing  hiêng 
    _D  ac    ăc    âc    ưc    oac   oăc   uâc   uưc   ic    iêc   êc    ec    --    uyêc  uêc   oec   ic          c     êc          yêc   hic   hiêc  
    _E  anh   ơm    ơn    ơng   oanh  ươm   uơn   uơng  on    ong   ôn    ông   un    ung   uôn   uông              on    ong               on    ong   
    _F  ach   ơp    ơt    ơc    oach  ươp   uơt   uơc   ot    oc    ôt    ôc    ut    uc    uôt   uôc               ot    oc                ot    oc


    Việc giải mã toàn phần cũng có thể làm tương tự: có bao nhiêu âm vần, ký tự dạng eo, êu thì sẽ thêm bấy nhiêu âm vần, ký tự dạng heo, u. Số ký tự của mã A3, A4 lúc ấy sẽ lớn hơn 256, nhưng không sao. Vì cho giải mã toàn phần, mã đích không phải là A4', A3' hay A2 mà là A1 [#24], A [#20] hoặc thậm chí UTF-8. Trong cách mới này tập các mã âm vần dạng thứ nhất không nhất thiết phải thật gọn và mình đã tranh thủ tự do ấy để cải biên nó một tý (Bảng 3d). Ở [#63] nó là khoảng [81,AD], vốn nằm gọn trong 3 cột 8_,9_,A_, còn ở đây, nó phân tán trong 4 cột 8_,9_,A_,B_. Chỉ để làm đẹp, để loại bỏ tàn dư "tà đạo" (7).

    Trong hai case g/ghng/ngh, 4 cột này sẽ ánh xạ sang 16_,17_,18_,19_. Theo cách mới này, giải nén tiền tố làm phát sinh thêm 2 cột trong bảng mã âm vần (Bảng 3d), giải mã toàn phần phát sinh thêm 2 cột nữa. Nếu dùng mã A3', A4' làm mã đích, mỗi phần tử của mảng âm vần chiếm 1 byte. Nếu dùng mã A hay A1 làm mã đích, mỗi phần tử của mảng âm vần sẽ chiếm 4 byte (8). Tóm lại, cách mới làm phát sinh thêm 2 * 16 = 32 byte để giải nén tiền tố và 4 * 16 * 4 = 256 byte để giải mã toàn phần. Đó là cái giá trả cho việc "xử đẹp" mã g/gh, phụ âm đầu "bất trị" cuối cùng (9), mở toang cánh cửa ra thế giới bảo mật, nơi mọi mã số đều có thời gian giải mã bằng nhau.



    (---hết tập 4---)






    _________________________
    (1) Quan hệ "lớn hơn" và "nhỏ hơn" trên các toán hạng không dấu được biết dưới tên gọi abovebelow trong thuật ngữ của Intel, AMD.

    (2) Trên một bộ xử lý hiện đại, mã âm đầu được giải song song với mã âm vần. (Người dùng chỉ việc viết code nối tiếp, việc song song hoá bộ biên dịch và bộ xử lý tự lo.) Có điều trớ trêu là mình chỉ nghĩ ra cách (chính là bài này) hiện thực hoá ý tưởng đó sau cố gắng thất bại, sau khi kết luận là không làm được và đành tấn công trực diện vào phép giải mã âm đầu, với 2 cánh cửa "thép" là phụ âm g/gh.

    (3) Lớp hậu tố hix chỉ được mã hóa bằng 1 ký tự khi theo sau g. Sau các tiền tố khác, nó vẫn được mã hóa bằng 2 ký tự như xưa. Ví dụ, chữ hỉ vẫn mã hóa bằng h-ỉ, chữ hiếm bằng h-iếm, chữ khi bằng k-h-i, chữ nhiều bằng n-h-iều và chữ chim bằng c-h-im.

    (4) Không có ý so sánh, miền Trung có nơi phát âm r thành ng, như ngầy la (rầy la) và miền Bắc có nơi phát âm r thành nh, như nhùn mình (rùn mình). Miền Bắc có thợ ruộm (nhuộm) thì miền Nam cũng có "hổm rày" (từ hôm ấy đến nay, hổm = hôm ấy, rày = nay.)

    (5) Chẳng phải nhà văn, nhà báo mới có quyền kể chuyện. Mấy chục năm trước, có hai cô gái chơi với nhau. Cô gái miền Nam chọc bạn, "con tâu tắng buộc bờ te tụi, ăn no béo tòn như cái tống teo." Cô gái miền Bắc bèn trêu giả, "thân em như cá mề, lao xao ngoài chợ biết về tay ai." Cô gái miền Nam ấy là mẹ mình và chuyện này, mình nghe mẹ kể. Mẹ mình không nói r như thế và cô bạn cũng không nói tr như thế. Với mình gô mề hay tâu tắng đều là tiếng mẹ và Nam, Bắc hai miền, đâu cũng là quê.

    (6) Khai thác bản sắc ấy ngày nay cũng không còn mấy phần độc đáo. Nói cho cùng, ga (drap) [trải giường] thời buổi này đã trở thành một từ thông dụng; mà nó thì không đến từ miệt vườn, miệt guộng (ruộng) hay bất cứ miệt nào của miền Nam.

    (7) Nhắc lại rằng cách giải mã mới ở đây nhằm xét nghiệm (và ánh xạ) tập trị có dạng "đẹp". Dẫu có dùng bảng mã nguyên thuỷ [#63], xử lý dạng thứ nhất vẫn là xét nghiệm S' = {8_,9_,A_,B_}, vốn là tập trị "đẹp" nhỏ nhất bao hàm tập trị "xấu" S = [81,AD], để rồi ánh xạ S' sang 4 cột mới. Vậy, bảng mã mới không tiêu dùng bộ nhớ nhiều hơn bảng mã nguyên thuỷ.

    (8) Mã A1 có lợi ích (so với mã A) là mỗi âm vần được biểu diễn bằng một xâu 4 ký tự (so với 5 ký tự ở mã A). Nhờ thế, có thể chứa từng ký tự trong 1 byte riêng biệt và giải mã bằng cách quét từng byte trong bộ nhớ (thay vì quét từng cụm 6 bit trên thanh ghi).

    (9) Thật ra, trong việc giải mã toàn phần, g/ghng/ngh đều "bất trị" như nhau và 256 byte là giá trả cho việc "xử đẹp" cả hai.
    Đã được chỉnh sửa lần cuối bởi Ada : 05-11-2021 lúc 08:06 AM.
    -...- -.- .. .-.. .-.. - .... . -... . .- ... - .-.-.

Trang 7 trên tổng số 7 Đầu tiênĐầu tiên ... 567

Các đề tài tương tự

  1. Dịch vụ gửi hàng hóa đi Australia, gửi hàng hóa đi France, gửi hàng hóa đi Germany, gửi hàng hóa đi Janpan giá rẻ.
    Gửi bởi sales5ttico trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 1
    Bài viết cuối: 30-07-2014, 02:51 PM
  2. Tính thành tiền trong bảng hóa đơn từ bảng chi tiết hóa đơn
    Gửi bởi tuanvi261 trong diễn đàn Thắc mắc đại cương Database & Reporting
    Trả lời: 2
    Bài viết cuối: 06-05-2013, 08:32 PM
  3. Hóa chất làm giảm điện trở đất, bột than tiếp địa, cọc tiếp địa, cọc thép mạ đồng, kim thu sét ese
    Gửi bởi chong set trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 18-04-2012, 12:33 PM
  4. Gọi hàm con.. tiến hóa khôn lường
    Gửi bởi luckyfor trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 06-10-2011, 03:58 PM

Tags của đề tài này

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn