ระบบตัวเลขอสมมาตร
ระบบตัวเลขอสมมาตร ( ANS ) [ ‡ 1 ] [ ‡ 2 ]เป็นกลุ่มของวิธีการเข้ารหัสเอนโทรปี ที่คิดค้นโดย Jarosław (Jarek) Duda [ ‡ 3 ]จากมหาวิทยาลัย Jagiellonianซึ่งใช้ในการบีบอัดข้อมูลตั้งแต่ปี 2014 [ ‡ 4 ]เนื่องจากประสิทธิภาพที่ดีขึ้นเมื่อเทียบกับวิธีการก่อนหน้า[ 1 ] ANS ผสมผสานอัตราส่วนการบีบอัดของการเข้ารหัสเลขคณิต (ซึ่งใช้การกระจายความน่าจะเป็น ที่แม่นยำเกือบทั้งหมด ) เข้ากับต้นทุนการประมวลผลที่คล้ายกับการเข้ารหัส Huffman [ ‡ 1 ]ในรูปแบบ ANS แบบตาราง (tANS) นี้ ทำได้โดยการสร้างเครื่องสถานะจำกัดเพื่อทำงานกับตัวอักษรขนาดใหญ่โดยไม่ต้องใช้การคูณ[ ‡ 2 ]
ANS ถูกใช้ในคอมเพรสเซอร์Facebook Zstandard [ 2 ] [ 3 ] (ใช้ในเคอร์เนลLinux [ 4 ] เบราว์เซอร์Google Chrome [ 5 ] ระบบปฏิบัติการ Android [ 6 ]และเผยแพร่เป็น RFC 8478 สำหรับMIME [ 7 ]และHTTP [ 8 ] ด้วยเช่นกัน ) คอมเพรสเซอร์Apple LZFSE [ 9 ] คอมเพรสเซอร์ Google Draco 3D [ 10 ] (ใช้ในรูปแบบPixar Universal Scene Description [ 11 ] ) และคอมเพรสเซอร์รูปภาพ PIK [ 12 ] คอมเพรสเซอร์ CRAM DNA [ 13 ]จาก ยูทิ ลิตี้SAMtools [ 14 ] ไลบรารีการบีบอัดความเร็วสูง NVIDIA nvCOMP [ 15 ] คอมเพรสเซอร์ Dropbox DivANS [ 16 ] คอมเพรสเซอร์พื้นผิว Microsoft DirectStorage BCPack [ 17 ] JPEG XLระยะยาว[ 18 ] และ คอมเพรสเซอร์รูปภาพJPEG AI ที่ใช้การเรียนรู้[ 19 ]
แนวคิดพื้นฐานคือการเข้ารหัสข้อมูลลงในจำนวนธรรมชาติเพียงจำนวนเดียว[ ‡ 2 ]ในระบบเลขฐานสองมาตรฐาน เราสามารถเพิ่มบิตได้ข้อมูลถึงโดยการต่อท้ายในตอนท้ายของซึ่งทำให้เราได้สำหรับตัวเข้ารหัสเอนโทรปีแล้ว วิธีนี้จะเหมาะสมที่สุดหากANS ขยายกระบวนการนี้ไปใช้กับชุดสัญลักษณ์ใดๆ ก็ได้พร้อมด้วยการกระจายความน่าจะเป็นที่เกี่ยวข้องใน ANS หากข้อมูลจากถูกแนบมาด้วยส่งผลให้, แล้วในทำนองเดียวกัน, ที่ไหนคือจำนวนบิตของข้อมูลที่จัดเก็บอยู่ในตัวเลข, และคือจำนวนบิตที่อยู่ในสัญลักษณ์นั้น[ ‡ 2 ]
สำหรับกฎการเข้ารหัส เซตของจำนวนธรรมชาติจะถูกแบ่งออกเป็นเซตย่อยที่ไม่ซ้ำกันซึ่งสอดคล้องกับสัญลักษณ์ที่แตกต่างกัน–เหมือนกับการแบ่งเป็นจำนวนคู่และจำนวนคี่ แต่มีความหนาแน่นที่สอดคล้องกับการกระจายความน่าจะเป็นของสัญลักษณ์ที่จะเข้ารหัส จากนั้นจึงเพิ่มข้อมูลจากสัญลักษณ์เข้าไป เข้าสู่ข้อมูลที่จัดเก็บไว้แล้วในหมายเลขปัจจุบันเราไปที่หมายเลขเป็นตำแหน่งของการปรากฏตัวครั้งที่ - จากเซตย่อยที่ -th [ ‡ 2 ]
มีวิธีอื่นในการนำไปใช้ในทางปฏิบัติได้แก่สูตรทางคณิตศาสตร์โดยตรงสำหรับขั้นตอนการเข้ารหัสและการถอดรหัส (uABS และ rANS) หรือสามารถใส่พฤติกรรมทั้งหมดลงในตารางได้ (tANS) [ ‡ 1 ]การปรับค่าใหม่ใช้เพื่อป้องกัน ไปสู่ค่าอนันต์–การถ่ายโอนบิตที่สะสมไปยังหรือจากบิตสตรีม[ ‡ 2 ]
การเข้ารหัสเอนโทรปี
สมมติว่าเราต้องการเข้ารหัสลำดับของเลขศูนย์และเลขหนึ่งจำนวน 1,000 ตัว ซึ่งจะต้องใช้พื้นที่ 1,000 บิตในการจัดเก็บโดยตรง อย่างไรก็ตาม หากทราบว่าลำดับดังกล่าวมีเลขศูนย์เพียง 1 ตัวและเลขหนึ่ง 999 ตัว ก็เพียงพอที่จะเข้ารหัสตำแหน่งของเลขศูนย์ ซึ่งใช้พื้นที่เพียง 1 บิตเท่านั้นใช้บิตจำนวนน้อยลงแทนที่จะเป็น 1000 บิตตามเดิม
โดยทั่วไป ลำดับที่มีความยาวดังกล่าวประกอบด้วยศูนย์และหนึ่ง ด้วยความน่าจะเป็นบางประการเรียกว่าการรวมกันโดยใช้การประมาณของสเตอร์ลิงเราจะได้จำนวนเชิงอะซิมโทติกของพวกมันเป็น
เรียกว่าเอนโทรปีของแชนนอน[ 20 ]
ดังนั้น ในการเลือกหนึ่งลำดับดังกล่าว เราจึงต้องการประมาณบิต มันยังคงเป็นบิต ถ้าอย่างไรก็ตาม มันอาจจะเล็กกว่านั้นมากก็ได้ ตัวอย่างเช่น เราต้องการเพียงแค่บิตสำหรับ.
ตัวเข้ารหัสเอนโทรปีช่วยให้สามารถเข้ารหัสลำดับของสัญลักษณ์โดยใช้บิตเอนโทรปีของแชนนอนโดยประมาณต่อสัญลักษณ์ ตัวอย่างเช่น ANS สามารถใช้โดยตรงเพื่อแจงนับชุดค่าผสม: กำหนดจำนวนธรรมชาติที่แตกต่างกันให้กับลำดับของสัญลักษณ์แต่ละลำดับที่มีสัดส่วนคงที่ในลักษณะที่เกือบจะเหมาะสมที่สุด[ ‡ 2 ]
ตรงกันข้ามกับชุดการเข้ารหัส การกระจายความน่าจะเป็นนี้มักจะแตกต่างกันไปในโปรแกรมบีบอัดข้อมูล ด้วยเหตุนี้ เอนโทรปีของแชนนอนจึงสามารถมองได้ว่าเป็นค่าเฉลี่ยถ่วงน้ำหนัก: สัญลักษณ์ของความน่าจะเป็นประกอบด้วยบิตของข้อมูล ระบบเลขฐานสิบหก (ANS) เข้ารหัสข้อมูลลงในจำนวนธรรมชาติเพียงจำนวนเดียวซึ่งตีความได้ว่าประกอบด้วยข้อมูลย่อย การเพิ่มข้อมูลจากสัญลักษณ์ความน่าจะเป็นเพิ่มเนื้อหาข้อมูลนี้ให้มากขึ้นดังนั้น ตัวเลขใหม่ที่ประกอบด้วยข้อมูลทั้งสองอย่างควรจะเป็น[ ‡ 2 ]
ตัวอย่างที่สร้างแรงบันดาลใจ
พิจารณาแหล่งข้อมูลที่มีตัวอักษร 3 ตัว คือ A, B, C โดยมีความน่าจะเป็น 1/2, 1/4, 1/4 การสร้างรหัสคำนำหน้าที่ดีที่สุดในระบบเลขฐานสองนั้นทำได้ง่าย คือ A = 0, B = 10, C = 11 จากนั้นข้อความจะถูกเข้ารหัสเป็น ABC -> 01011
เราพบว่าวิธีการเข้ารหัสที่เทียบเท่ากันมีดังต่อไปนี้:
- เริ่มจากเลข 1 แล้วทำการคำนวณกับตัวเลขนั้นสำหรับตัวอักษรแต่ละตัวที่ป้อนเข้ามา
- A = คูณด้วย 2; B = คูณด้วย 4 แล้วบวก 2; C = คูณด้วย 4 แล้วบวก 3
- แปลงตัวเลขนั้นให้อยู่ในรูปเลขฐานสอง แล้วลบเลข 1 ตัวแรกออก
ลองพิจารณาแหล่งข้อมูลทั่วไปที่มีตัวอักษร k ตัว โดยมีความน่าจะเป็นแบบตรรกยะจากนั้น การเข้ารหัสเลขคณิตบนแหล่งข้อมูลจะต้องใช้การคำนวณเลขคณิตที่แม่นยำกับจำนวนเต็มเท่านั้น[ ‡ 1 ]
โดยทั่วไป ANS เป็นการประมาณค่าด้วยการเข้ารหัสทางคณิตศาสตร์ที่ประมาณค่าความน่าจะเป็นที่แท้จริงโดยจำนวนตรรกยะโดยมีตัวหารขนาดเล็ก[ ‡ 2 ]
แนวคิดพื้นฐานของ ANS

ลองนึกภาพว่ามีข้อมูลบางอย่างถูกเก็บไว้ในจำนวนธรรมชาติตัวอย่างเช่น ลำดับบิตของการขยายเลขฐานสอง เพื่อเพิ่มข้อมูลจากตัวแปรเลขฐานสองเราสามารถใช้ฟังก์ชันการเขียนโค้ดได้ซึ่งจะเลื่อนบิตทั้งหมดขึ้นไปหนึ่งตำแหน่ง และวางบิตใหม่ไว้ในตำแหน่งที่มีค่าน้อยที่สุด ทีนี้มาดูฟังก์ชันการถอดรหัสกันช่วยให้สามารถเรียกดูข้อมูลก่อนหน้าได้และส่วนเพิ่มเติมนี้:เราสามารถเริ่มต้นด้วยสถานะเริ่มต้น จากนั้นใช้ใช้ฟังก์ชันกับบิตที่ต่อเนื่องกันของลำดับบิตจำกัดเพื่อให้ได้ผลลัพธ์สุดท้ายหมายเลขที่เก็บลำดับทั้งหมดนี้ จากนั้นใช้ฟังก์ชันนี้ทำงานหลายครั้งจนกระทั่งช่วยให้สามารถเรียกกลับลำดับบิตในลำดับย้อนกลับได้[ ‡ 2 ]
วิธีการข้างต้นเหมาะสมที่สุดสำหรับการกระจายความน่าจะเป็นแบบสม่ำเสมอ (สมมาตร) ของสัญลักษณ์ANS ขยายความให้เหมาะสมที่สุดสำหรับรูปแบบการแจกแจงความน่าจะเป็นแบบไม่สมมาตรของสัญลักษณ์ใดๆ ที่เลือกไว้:. ในขณะที่ในตัวอย่างข้างต้นคือการเลือกระหว่างเลขคู่และเลขคี่ใน ANS การแบ่งจำนวนธรรมชาติแบบคู่/คี่จะถูกแทนที่ด้วยการแบ่งออกเป็นเซตย่อยที่มีความหนาแน่นสอดคล้องกับการกระจายความน่าจะเป็นที่กำหนดไว้: จนถึงตำแหน่งมีอยู่ประมาณการปรากฏของสัญลักษณ์[ ‡ 2 ]
ฟังก์ชันการเข้ารหัสส่งคืนการปรากฏครั้งที่ - จากชุดย่อยดังกล่าวที่สอดคล้องกับสัญลักษณ์ข้อสมมติเรื่องความหนาแน่นนั้นเทียบเท่ากับเงื่อนไขดังกล่าวโดยสมมติว่าเป็นจำนวนธรรมชาติประกอบด้วยข้อมูลเล็กๆ น้อยๆดังนั้นจึงเป็นสัญลักษณ์แห่งความน่าจะเป็นถูกเข้ารหัสโดยมีเนื้อหาอยู่ภายในบิตของข้อมูลตามที่ต้องการจากตัวเข้ารหัสเอนโทรปี [ ‡ 2 ]
ตัวแปร
ตัวแปรไบนารีแบบสม่ำเสมอ (uABS)
เรามาเริ่มต้นด้วยตัวอักษรไบนารีและการกระจายความน่าจะเป็นกันก่อน,จนถึงตำแหน่งเราต้องการประมาณอนาล็อกของเลขคี่ (สำหรับเราสามารถเลือกจำนวนการปรากฏตัวนี้ได้ดังนี้, ได้รับรูปแบบนี้เรียกว่าuABSและนำไปสู่ฟังก์ชันการถอดรหัสและการเข้ารหัสดังต่อไปนี้: [ 21 ]
การถอดรหัส:
s = ceil (( x + 1 ) * p ) - ceil ( x * p ) // 0 ถ้า fract(x*p) < 1-p มิฉะนั้น 1 ถ้าs = 0 แล้วnew_x = x - ceil ( x * p ) // D(x) = (new_x, 0) ซึ่งเหมือนกับ new_x = floor(x*(1-p)) ถ้าs = 1 แล้วnew_x = ceil ( x * p ) // D(x) = (new_x, 1)การเข้ารหัส:
ถ้าs = 0 แล้วnew_x = ceil (( x + 1 ) / ( 1 - p )) - 1 // C(x,0) = new_x ถ้าs = 1 แล้วnew_x = floor ( x / p ) // C(x,1) = new_xสำหรับมันก็คือระบบเลขฐานสองมาตรฐาน (โดยที่ 0 และ 1 สลับตำแหน่งกัน) ด้วยเหตุผลที่แตกต่างกันมันจะกลายเป็นสิ่งที่ดีที่สุดสำหรับการกระจายความน่าจะเป็นที่กำหนดนี้[ 21 ]ตัวอย่างเช่น สำหรับสูตรเหล่านี้จะนำไปสู่ตารางสำหรับค่าเล็กๆ ของ:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | ||||||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
สัญลักษณ์สอดคล้องกับเซตย่อยของจำนวนธรรมชาติที่มีความหนาแน่นซึ่งในกรณีนี้คือตำแหน่งต่างๆ. เช่นตำแหน่งเหล่านี้จะเพิ่มขึ้น 3 หรือ 4 ตำแหน่ง เนื่องจากในที่นี้ รูปแบบของสัญลักษณ์จะซ้ำกันทุกๆ 10 ตำแหน่ง
การเขียนโค้ดสามารถค้นหาได้โดยการเลือกแถวที่ตรงกับสัญลักษณ์ที่กำหนดและเลือกสิ่งที่กำหนดให้ในแถวนี้ จากนั้นแถวบนสุดจะแสดงข้อมูล. ตัวอย่างเช่น,จากแถวกลางไปยังแถวบนสุด
ลองนึกภาพว่าเราต้องการเข้ารหัสลำดับ '0100' โดยเริ่มต้นจาก. อันดับแรกพาเราไป, แล้วถึง, แล้วถึง, แล้วถึงโดยใช้ฟังก์ชันการถอดรหัสในรอบชิงชนะเลิศนี้เราสามารถดึงลำดับสัญลักษณ์ออกมาได้ โดยใช้ตารางเพื่อจุดประสงค์นี้แถวแรกจะเป็นตัวกำหนดคอลัมน์ จากนั้นแถวที่ไม่ว่างและค่าที่เขียนไว้จะเป็นตัวกำหนดคอลัมน์ที่สอดคล้องกันและ.
ตัวแปรช่วง (rANS) และการสตรีม
รูปแบบช่วงยังใช้สูตรทางคณิตศาสตร์ แต่ช่วยให้สามารถดำเนินการกับตัวอักษรขนาดใหญ่ได้[ ‡ 2 ]โดยสัญชาตญาณแล้ว มันจะแบ่งเซตของจำนวนธรรมชาติออกเป็นช่วงที่มีขนาดและแบ่งแต่ละส่วนออกเป็นช่วงย่อยในลักษณะเดียวกัน โดยมีสัดส่วนตามการแจกแจงความน่าจะเป็นที่สมมติขึ้น
เราเริ่มต้นด้วยการแบ่งการกระจายความน่าจะเป็นออกเป็นขั้นๆโดยที่nถูกเลือก (โดยปกติคือ 8-12 บิต):สำหรับจำนวนธรรมชาติบางจำนวน(ขนาดของช่วงย่อย)
ระบุและฟังก์ชันการกระจายสะสม:
โปรดสังเกตว่า ฟังก์ชันนี้ไม่ใช่ฟังก์ชันการกระจายสะสม (CDF) ที่แท้จริง เนื่องจากความน่าจะเป็นของสัญลักษณ์ปัจจุบันไม่ได้รวมอยู่ในค่าของนิพจน์ แต่แสดงถึงความน่าจะเป็นรวมของสัญลักษณ์ก่อนหน้าทั้งหมด ตัวอย่างเช่น แทนที่จะใช้คำจำกัดความปกติของมันจะถูกประเมินเป็นเนื่องจากไม่มีสัญลักษณ์ก่อนหน้าCDF[s]CDF[s]CDF[0]=f[0]CDF[0]=0
สำหรับระบุฟังก์ชัน (โดยปกติจะแสดงในรูปแบบตาราง)
สัญลักษณ์( y ) = s โดยที่CDF [ s ] <= y < CDF [ s + 1 ]ฟังก์ชันการเขียนโค้ดต่อไปนี้คือ:
C ( x , s ) = ( floor ( x / f [ s ]) << n ) + ( x % f [ s ]) + CDF [ s ]การถอดรหัส:
s = symbol ( x & mask ) D ( x ) = ( f [ s ] * ( x >> n ) + ( x & mask ) - CDF [ s ], s )ด้วยวิธีนี้ เราสามารถเข้ารหัสลำดับของสัญลักษณ์ลงในจำนวนธรรมชาติขนาดใหญ่xได้ เพื่อหลีกเลี่ยงการใช้เลขคณิตของจำนวนขนาดใหญ่ ในทางปฏิบัติจึงใช้รูปแบบสตรีมซึ่งบังคับใช้โดยการปรับค่าใหม่: การส่งบิตที่มีค่าน้อยที่สุดของxไปหรือจากบิตสตรีม (โดยปกติLและbจะเป็นกำลังของ 2) [ ‡ 2 ]
ในรูปแบบ rANS นั้นxอาจเป็นจำนวนเต็ม 32 บิต ตัวอย่างเช่น สำหรับการปรับค่าใหม่แบบ 16 บิต () ตัวถอดรหัสจะเติมบิตที่มีค่าน้อยที่สุดจากบิตสตรีมเมื่อจำเป็น:
ถ้า( x < ( 1 << 16 )) { x = ( x << 16 ) + อ่าน 16 บิต() }รูปแบบตาราง (tANS)

ตัวแปร tANS จะกำหนดพฤติกรรมทั้งหมด (รวมถึงการปรับค่าใหม่) สำหรับแปลงเป็นตารางซึ่งให้ผลลัพธ์เป็นเครื่องสถานะจำกัดโดยหลีกเลี่ยงความจำเป็นในการคูณ[ ‡ 2 ]
สุดท้ายนี้ ขั้นตอนของลูปการถอดรหัสสามารถเขียนได้ดังนี้:
t = decodingTable ( x ); x = t.newX + readBits ( t.nbBits ) ; // การเปลี่ยนสถานะwriteSymbol ( t.symbol ); //สัญลักษณ์ที่ถอดรหัสแล้วขั้นตอนของลูปการเข้ารหัส:
s = ReadSymbol (); nbBits = ( x + ns [ s ]) >> r ; // จำนวนบิตสำหรับการปรับค่าใหม่writeBits ( x , nbBits ); // ส่งบิตที่มีค่าน้อยที่สุดไปยังบิตสตรีมx = encodingTable [ start [ s ] + ( x >> nbBits )];การกำหนดรหัส tANS เฉพาะเจาะจงนั้นทำได้โดยการกำหนดสัญลักษณ์ให้กับทุกๆตำแหน่ง จำนวนครั้งที่ปรากฏควรเป็นสัดส่วนกับความน่าจะเป็นที่สมมติขึ้น ตัวอย่างเช่น เราอาจเลือกการกำหนด "abdacdac" สำหรับการแจกแจงความน่าจะเป็น Pr(a)=3/8, Pr(b)=1/8, Pr(c)=2/8, Pr(d)=2/8 หากมีการกำหนดสัญลักษณ์ในช่วงความยาวที่เป็นกำลังของ 2 เราจะได้การเข้ารหัส Huffmanตัวอย่างเช่น จะได้รหัสคำนำหน้า a->0, b->100, c->101, d->11 สำหรับ tANS ด้วยการกำหนดสัญลักษณ์ "aaaabcdd" [ ‡ 1 ]

หมายเหตุ
สำหรับการเข้ารหัส Huffman การปรับเปลี่ยนการกระจายความน่าจะเป็นของ tANS นั้นมีต้นทุนค่อนข้างสูง ดังนั้นจึงมักใช้ในสถานการณ์คงที่ โดยปกติจะใช้กับ รูปแบบ Lempel–Ziv บาง รูปแบบ (เช่น ZSTD, [ 2 ] LZFSE [ 9 ] ) ในกรณีนี้ ไฟล์จะถูกแบ่งออกเป็นบล็อกโดยแต่ละบล็อกจะนับความถี่ของสัญลักษณ์อย่างอิสระ จากนั้นหลังจากประมาณค่า (การหาปริมาณ) จะเขียนลงในส่วนหัวของบล็อกและใช้เป็นการกระจายความน่าจะเป็นแบบคงที่สำหรับ tANS [ ‡ 1 ]
ในทางตรงกันข้าม rANS มักใช้แทนการเข้ารหัสช่วง ที่เร็วกว่า ( เช่นCRAM [ 13 ] LZNA, Draco [ 10 ] ) ต้องใช้การคูณ แต่มีประสิทธิภาพด้านหน่วยความจำมากกว่าและเหมาะสมสำหรับการปรับเปลี่ยนการกระจายความน่าจะเป็นแบบไดนามิก[ ‡ 2 ]
การเข้ารหัสและการถอดรหัสของ ANS ดำเนินการในทิศทางตรงกันข้าม ทำให้เป็นสแต็กสำหรับสัญลักษณ์ ความไม่สะดวกนี้มักจะได้รับการแก้ไขโดยการเข้ารหัสในทิศทางย้อนกลับ หลังจากนั้นจึงสามารถถอดรหัสไปข้างหน้าได้[ ‡ 2 ]สำหรับการพึ่งพาบริบท เช่นแบบจำลองมาร์คอฟตัวเข้ารหัสจำเป็นต้องใช้บริบทจากมุมมองของการถอดรหัสในภายหลัง สำหรับการปรับตัว ตัวเข้ารหัสควรดำเนินการไปข้างหน้าก่อนเพื่อค้นหาความน่าจะเป็นที่จะใช้ (ทำนาย) โดยตัวถอดรหัสและจัดเก็บไว้ในบัฟเฟอร์ จากนั้นเข้ารหัสในทิศทางย้อนกลับโดยใช้ความน่าจะเป็นที่จัดเก็บไว้ในบัฟเฟอร์[ ‡ 2 ]
สถานะสุดท้ายของการเข้ารหัสจำเป็นสำหรับการเริ่มต้นการถอดรหัส ดังนั้นจึงต้องจัดเก็บไว้ในไฟล์บีบอัด ค่าใช้จ่ายนี้สามารถชดเชยได้โดยการจัดเก็บข้อมูลบางอย่างไว้ในสถานะเริ่มต้นของตัวเข้ารหัส ตัวอย่างเช่น แทนที่จะเริ่มต้นด้วยสถานะ "10000" ให้เริ่มต้นด้วยสถานะ "1****" โดยที่ "*" คือบิตที่จัดเก็บเพิ่มเติม ซึ่งสามารถเรียกคืนได้เมื่อสิ้นสุดการถอดรหัส หรืออีกทางหนึ่ง สถานะนี้สามารถใช้เป็นค่าตรวจสอบความถูกต้องได้โดยการเริ่มต้นการเข้ารหัสด้วยสถานะคงที่ และทดสอบว่าสถานะสุดท้ายของการถอดรหัสเป็นไปตามที่คาดไว้หรือไม่[ ‡ 2 ]
ข้อพิพาทเรื่องสิทธิบัตร
ผู้เขียนอัลกอริธึม ANS และรูปแบบต่างๆ เช่น tANS และ rANS ตั้งใจให้ผลงานของเขาสามารถเข้าถึงได้ฟรีในโดเมนสาธารณะด้วยเหตุผลด้านมนุษยธรรม เขาไม่ได้แสวงหาผลกำไรจากผลงานเหล่านี้ และได้ดำเนินการเพื่อให้แน่ใจว่าผลงานเหล่านี้จะไม่กลายเป็น "กับดักทางกฎหมาย" หรือถูกจำกัด หรือถูกแสวงหาผลกำไรจากผู้อื่น[ 1 ]ในปี 2015 Google ได้เผยแพร่สิทธิบัตรในสหรัฐอเมริกาและทั่วโลกสำหรับ "การเข้ารหัสสัมประสิทธิ์ ans โทเค็นบูลีนแบบผสม" [ 22 ]ในขณะนั้น ศาสตราจารย์ Duda ได้รับคำขอจาก Google ให้ช่วยในเรื่องการบีบอัดวิดีโอ ดังนั้นเขาจึงมีความรู้ความเข้าใจอย่างลึกซึ้งในด้านนี้ โดยมีผู้เขียนต้นฉบับคอยให้ความช่วยเหลือ
ดูดาไม่พอใจที่ (บังเอิญ) ค้นพบเจตนาสิทธิบัตรของ Google เนื่องจากเขาระบุชัดเจนว่าต้องการให้เป็นสาธารณสมบัติ และได้ช่วยเหลือ Google โดยเฉพาะบนพื้นฐานนั้น[ 1 ]ต่อมาดูดาได้ยื่นคำขอของบุคคลที่สาม[ ‡ 5 ]ต่อสำนักงานสิทธิบัตรของสหรัฐอเมริกาเพื่อขอให้ปฏิเสธ สำนักงานสิทธิบัตรของสหรัฐอเมริกาปฏิเสธคำขอในปี 2018 และต่อมา Google ก็ละทิ้งสิทธิบัตรดังกล่าว[ 23 ]
ในเดือนมิถุนายน พ.ศ. 2562 ไมโครซอฟต์ได้ยื่นคำขอสิทธิบัตรชื่อ "คุณสมบัติของการเข้ารหัสและการถอดรหัสระบบตัวเลขแบบไม่สมมาตรตามช่วง" [ 24 ]สำนักงานสิทธิบัตรสหรัฐฯ (USPTO) ได้ออกคำปฏิเสธขั้นสุดท้ายของคำขอเมื่อวันที่ 27 ตุลาคม พ.ศ. 2563 [ 24 ]อย่างไรก็ตาม เมื่อวันที่ 2 มีนาคม พ.ศ. 2564 ไมโครซอฟต์ได้ยื่นคำชี้แจงต่อ USPTO โดยระบุว่า "ผู้ยื่นคำขอไม่เห็นด้วยกับคำปฏิเสธดังกล่าว" [ 25 ]เพื่อขอให้ศาลพิจารณาคำปฏิเสธขั้นสุดท้ายอีกครั้งภายใต้โครงการ "After Final Consideration Pilot 2.0" [ 26 ]หลังจากการพิจารณาใหม่ USPTO ได้อนุมัติคำขอเมื่อวันที่ 25 มกราคม พ.ศ. 2565 [ 24 ]
ดูเพิ่มเติม
- การเข้ารหัสเอนโทรปี
- การเข้ารหัสฮัฟฟ์แมน
- การเข้ารหัสเลขคณิต
- การเข้ารหัสช่วง
- ตัวบีบอัดข้อมูล Facebook ของ Zstandard
- คอมเพรสเซอร์LZFSE Apple
ลิงก์ภายนอก
- Duda, Jarek (2 พฤศจิกายน 2008). "การเข้ารหัสที่เหมาะสมที่สุดบนโครงข่ายแบบไม่ต่อเนื่องที่มีข้อจำกัดที่ไม่เปลี่ยนแปลงตามการเลื่อนตำแหน่งโดยใช้อัลกอริธึมทางสถิติ". arXiv : 0710.3861 [ cs.IT ].ซึ่งอาจเป็นการกล่าวถึง ANS ครั้งแรกสุด
- สถาปัตยกรรมฮาร์ดแวร์ประสิทธิภาพสูงสำหรับการเข้ารหัสเอนโทรปีของระบบตัวเลขอสมมาตร SM Najmabadi, Z. Wang, Y. Baroud, S. Simon, ISPA 2015
- ตัวเข้ารหัสเอนโทรปีรุ่นใหม่การนำเอนโทรปีสถานะจำกัด (FSE) มาใช้ใน tANS โดย Yann Collet
- rygorous/ryg_ransการนำ rANS ไปใช้โดย Fabian Giesen
- jkbonfield/rans_staticการใช้งาน rANS และการเข้ารหัสเลขคณิตอย่างรวดเร็วโดย James K. Bonfield
- โปรแกรมบีบอัด DNA CRAM 3.0 (rANS ลำดับที่ 1) (ส่วนหนึ่งของSAMtools ) โดยสถาบันชีวสารสนเทศแห่งยุโรป
- การนำไปใช้สำหรับ Google VP10
- การใช้งานสำหรับ Google WebP
- ไลบรารีการบีบอัดข้อมูล 3 มิติ Google Draco
- aom_dsp - aom - การนำ Git มาใช้ใน Googleเพื่อสนับสนุนAlliance for Open Media
- การบีบอัดข้อมูลโดยใช้ระบบตัวเลขอสมมาตร - โครงการสาธิตของ Wolframโครงการสาธิตของ Wolfram
- GST: พื้นผิวบีบอัดแบบพิเศษที่ถอดรหัสได้ด้วย GPU GST: พื้นผิวบีบอัดแบบพิเศษที่ถอดรหัสด้วย GPU
- หนังสือ Understanding Compressionโดย A. Haecky และ C. McAnlis