рдПрдиреНрдЯреНрд░реЙрдкреА рдХреЛрдбрд┐рдВрдЧ рдЖрд░рдПрдПрдирдПрд╕ рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ

рдпрд╣ рд▓реЗрдЦ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд░реБрдЪрд┐ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХрдореНрдкреНрд░реЗрд╢рди рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВ рдпрд╛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред



рд▓реЗрдЦ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдмреНрд▓реЙрдЧ рдХреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ , рдЬрд┐рд╕реЗ рдлрд╛рдмрд┐рдпрд╛рди рдЧрд┐рд╕реЗрди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред

рдкрд░рд┐рдЪрдп


рдПрдиреНрдЯреНрд░рд╛рдкреА рдХреЛрдбрд┐рдВрдЧ рд╡рд┐рдзрд┐ rANS ( r ange + ANS) FSE рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рд╣реЛрджрд░ рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдерд╛ ред рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо ANS рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрд╕рдордорд┐рдд рдЕрдВрдХ рдкреНрд░рдгрд╛рд▓реА , рдФрд░ рдирд╛рдо рд╕реАрдорд╛ рдореЗрдВ рд╢рдмреНрдж рдЕрдВрддрд░рд╛рд▓ рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреА рд╕рдорд╛рдирддрд╛ рдкрд░ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред RANS рдХреЗ рд▓реЗрдЦрдХ рдпрд╛рд░реЗрдХ рдбреВрдбрд╛ рд╣реИрдВ ред

рдЖрд░рдПрдирдПрд╕ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЧрддрд┐ рд╕реЗ рд▓рдЧрднрдЧ рдЗрд╖реНрдЯрддрдо рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдЗрд╕ rANS рдореЗрдВ FSE рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдЖрд╢реНрдЪрд░реНрдп рдХреА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ: рджреЛрдиреЛрдВ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЖрдзрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдПрдлрдПрд╕рдИ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП rANS рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рд▓рдВрдмрд╛ "рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ" рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдВрдЧреНрд░рд╣ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рд╕реВрддреНрд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдПрдиреНрдХреЛрдбрд┐рдВрдЧ: C(s,x): x := (x / Fs) * M + Bs + (x % Fs)
рдбрд┐рдХреЛрдбрд┐рдВрдЧ: D(x): s = sym[x % M], x := Fs * (x / M) + (x % M) - Bs

рдЖрдЗрдП рдЙрдирдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВред

рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди C (s, x) рд╡рд░реНрдг рдХреЛ рдПрдиреНрдХреЛрдбреЗрдб рд╣реЛрдиреЗ рджреЗрддрд╛ рд╣реИ (рдЗрд╕реЗ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реЛрдиреЗ рджреЗрдВ) рдФрд░ рдПрдирдХреЛрдбрд░ x (рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ) рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ред

рдПрдл рдПрд╕ - рдкреНрд░рддреАрдХ рдЖрд╡реГрддреНрддрд┐ рдПрд╕ ред рдЙрдкрд░реЛрдХреНрдд рдПрдлрдПрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрди рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИред
M рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЗ рд╕рднреА рдкреНрд░рддреАрдХреЛрдВ ( M = ) F s ) рдХреА рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реИред
рдПрд╕ рдореЗрдВ , рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП рд╡рд░реНрдг рдХреЗ рдЕрдиреБрд░реВрдк рдЕрдВрддрд░рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд (рдиреАрдЪреЗ рдХреА рдЖрдХреГрддрд┐ рдореЗрдВ)ред
x % F, F рдХреЗ рджреНрд╡рд╛рд░рд╛ x рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╢реЗрд╖ рднрд╛рдЧ рд╣реИред

рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдЕрдВрдХрдЧрдгрд┐рдд рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рд╕рдорд╛рди рд╣реИ: рд╣рдо рдЦрдВрдб [ 0, M) рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдг рдПрд╕ рд╡рд░реНрдг F рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд░рд╛рдмрд░ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛред рдХрд┐рд╕реА рднреА рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдореВрд▓реНрдп x% M рдХреА рдШрдЯрдирд╛ рдЗрд╕реА рдкреНрд░рддреАрдХ рдХреЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИред


рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдПрдХреНрд╕ рдХреЛ рдПрдХ рдордирдорд╛рдирд╛ рдЙрдкрдпреБрдХреНрдд рдорд╛рди рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╕рднреА рдПрдиреНрдХреЛрдб рдХрд┐рдП рдЧрдП рд╡рд░реНрдгреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рд╕реА (рдПрд╕, рдПрдХреНрд╕) рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВред

рдлрд╝рдВрдХреНрд╢рди C (s, x) рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЧрдгрдирд╛ x рдХрд╛ рдорд╛рди рдмрдврд╝рд╛рддреА рд╣реИред рдЬрдм рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдореЗрдВ рдбреЗрдЯрд╛ рдбрдВрдк рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

 while (x >= x_max) {   writeToStream(x % b); //     x /= b; //  x } 

рдЗрд╕ рдХрджрдо рдХреЛ рд░реЗрдиреЛрд╡реЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдХреЛрдбрд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдХреЛрдб рдореЗрдВ рдКрдкрд░, рдирдП рд╕реНрдерд┐рд░рд╛рдВрдХ рджрд┐рдЦрд╛рдИ рджрд┐рдП: x_max рдФрд░ b ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛ рдПрдо , рдмреА, рдФрд░ x_max рдХреБрдЫ рд╕рдВрдмрдВрдзреЛрдВ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд╣реИ рдпрджрд┐ рд░рд╛рдЬреНрдп uint32 рд░рд╛рдЬреНрдп x рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

рдПрдо = 2 ^ рдХреЗ , рдЬрд╣рд╛рдВ рдХреЗ <= 16
b = 2 ^ 16 (uint32 рдХрд╛ рдЖрдзрд╛ рдЖрдХрд╛рд░)

M = 2 ^ k рдХрд╛ рд╡рд┐рдХрд▓реНрдк рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ M рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрди рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╢реЗрд╖ рдХреЗ рд╕рд╛рде рд╡рд┐рднрд╛рдЬрди рдХреЛ рдмрд┐рдЯрд╡рд╛рдЗрдЬрд╝ рдСрдкрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

K рдХрд╛ рдорд╛рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, F s рдХреА рд╕рдЯреАрдХрддрд╛ рдЙрддрдиреА рд╣реА рдЕрдзрд┐рдХ рд╣реЛрдЧреА рдФрд░ рд╕рдВрдкреАрдбрд╝рди рдЬрд┐рддрдирд╛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрд╡реГрддреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдУрд╡рд░рд╣реЗрдб рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рдХрд╢реНрдореАрд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИред

X_max рдХрд╛ рдорд╛рди рдРрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреЛрдИ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рди рд╣реЛред рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдореЗрдВ рд╡рд╣ x < uint32_max * Fs / M рдпрд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рдорд┐рд▓рддрд╛ рд╣реИ: x_max <= ( b * L ) * Fs / M , рдЬрд╣рд╛рдВ L <= uint32_max / b ред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЛрдб рдореЗрдВ, рд╕реНрдерд┐рддрд┐ рдЧрдгрдирд╛ рдореЗрдВ рдУрд╡рд░рдлреНрд▓реЛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлреЙрд░реНрдо x / b> = L / M * Fs рд▓реЗрддреА рд╣реИред

рдорд╛рди b = 2 ^ 16 (uint32 рдХрд╛ рдЖрдзрд╛ рдЖрдХрд╛рд░) рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ x x_max рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ , рддреЛ b рджреНрд╡рд╛рд░рд╛ рдПрдХ рд╡рд┐рднрд╛рдЬрди рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдирддреАрдЬрддрди, while рдкрд╣рд▓реЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдореНрди рд░реВрдк рд▓реЗрддрд╛ рд╣реИ:

 typedef uint32_t RansState; constexpr uint32_t RANS_L = 1u << 16; constexpr uint32_t k = 10; //   constexpr uint32_t RANS_M = 1u << k; // M = 2^k //   s void RansEnc(RansState& x, uint32_t s, RansOutBuf& out) {   assert(x >= RANS_L); //        uint32 Fs = freq[s]; //   s   uint32 Bs = range_start[s]; //   s   assert(Fs > 0 && Fs <= RANS_M);     // renormalize   if ((x >> 16) >= (RANS_L >> k) * Fs) { // x / b >=  L / M * Fs       out.put( x & 0xffff );       x >>= 16;   }   x = ((x / Fs) << k) + Bs + (x % Fs); // C(s,x)     assert(x >= RANS_L); //      } 

рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ x рдХрд╛ рдорд╛рди рдмрдЪрд╛рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЗрд╕рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧреАред рдФрд░ рд╣рд╛рдВ, рд╣рдо рдЕрдВрдд рд╕реЗ рд╢реБрд░реБрдЖрдд рддрдХ, рдпрд╛рдиреА рдЖрдЦрд┐рд░реА рдПрдиреНрдХреЛрдбреЗрдб рдХреИрд░реЗрдХреНрдЯрд░ рд╕реЗ рдкрд╣рд▓реЗ рддрдХ рдбрд┐рдХреЛрдб рдХрд░реЗрдВрдЧреЗред ( рдПрдлрдПрд╕рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд▓реЗрдЦ рдореЗрдВ , рдЗрд╕ рдмрд┐рдВрджреБ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред)

рдореИрдВ рдереЛрдбрд╝реА рдФрд░ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдлреЙрд░реНрдореВрд▓рд╛ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

 x := (x / Fs) * M + Bs + (x % Fs) 

рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ ( x / Fs) * M , рдЪрд░ x рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ M = 2 ^ k )ред + Bs + (x % Fs) рдЬреЛрдбрд╝рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдЗрди рдмрд┐рдЯреНрд╕ рдХреЛ рд╡рд░реНрдг s рдХреЗ рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рд▓рд┐рдЦрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Bs рдЕрдВрддрд░рд╛рд▓ рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, рдФрд░ (x% Fs) рдЗрд╕ рдЕрдВрддрд░рд╛рд▓ рдХреЗ рднреАрддрд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ (рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдЖрдХрд╛рд░ Fs рд╣реИ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рдордп, рд╣рдо рдПрдиреНрдХреЛрдбреЗрдб рд╡рд░реНрдг рдХреЛ рдЙрд╕ рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдЧрд┐рд░рддрд╛ рд╣реИ (x% M)ред

рдбрд┐рдХреЛрдбрд┐рдВрдЧ

рдЪрд▓реЛ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред

 D(x): s = sym[x % M], x := Fs * (x / M) + (x % M) - Bs 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдКрдкрд░ рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдг s , рд╡рд┐рднрд╛рдЬрди x % M рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ ред рдХрд┐рд╕ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдорд╛рди (x% M) рдЧрд┐рд░ рдЧрдпрд╛, рдРрд╕рд╛ рдЪрд░рд┐рддреНрд░ рдПрдирдХреЛрдбреЗрдб рдерд╛ред

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ M = 2 ^ k рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕рдорд╛рдкреНрдд рд╣реБрдЖ:

 uint32_t RansDecode(RansState& x, RansInBuf& in) {   assert(x >= RANS_L); //       uint32_t x_mod = x & (RANS_M - 1); // = x % M   //  ,    x_mod,     assert(x_mod < dct.size());   uint32_t s = dct[x_mod]; //     uint32 Fs = freq[s]; //   s   uint32 Bs = range_start[s]; //    s   x = (x >> k) * Fs + x_mod - Bs;     // renormalize   if (x < RANS_L) {       x = (x << 16) | in.read16(); //  16    }     assert(x >= RANS_L); //     return s; } 

рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдЙрд╕реА рдПрдХреНрд╕ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЧрдИ рдереАред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдПрдиреНрдХреЛрдбреЗрдб рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдбрд┐рдХреЛрдбрд░ x рдХреА рд╕реНрдерд┐рддрд┐ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ x рдХрд╛ рд╕рдВрдЧрдд рдХреЛрдбрд┐рдВрдЧ рдЪрд░рдг рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд╕рдордп рдпрд╣ рддрдереНрдп рдмрд╣реБрдд рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди рдирд╣реАрдВ рд╣реИред

рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдмрд╕реЗ рдХрдард┐рди рдХреНрд╖рдг рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдорд╛рди рдЧрд┐рд░ рдЧрдпрд╛ (x% M)ред

рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рдФрд░ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХрд╛ рд╕рд┐рдВрдмрд▓ [] рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдЖрдХрд╛рд░ рдПрдоред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ FSE рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЙрд╕реА рдЖрдХрд╛рд░ рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдорд┐рд▓рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ rANS рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ "рдорд┐рд╢реНрд░рд┐рдд" рдирд╣реАрдВ рд╣реИ, рд╡рд░реНрдг рдХреНрд░рдо рдореЗрдВ рд╣реИрдВ, рдФрд░ рдРрд╕реА рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред

рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рджреЛрд╖ рд╕рд┐рдВрдмрд▓ рдЯреЗрдмрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд╣реИ, рдЬреЛ рдмрдврд╝рддреЗ рдХрд╢реНрдореАрд░ рдХреЗ рд╕рд╛рде рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддрд╛ рд╣реИред

рдЙрдкрдирд╛рдо рд╡рд┐рдзрд┐


рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рд╣рд┐рдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рд╡рд┐рдзрд┐ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╡рд┐рдзрд┐ рдЖрдкрдХреЛ рдЫреЛрдЯреЗ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ - рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗред


рдПрдХ рд▓рдВрдмреА рдФрд░ рд▓рдВрдмреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдпрд╣рд╛рдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдбрд╛рд░реНрдЯреНрд╕, рдбрд╛рдЗрд╕ рдФрд░ рд╕рд┐рдХреНрдХреЗ ред рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛: рд╣рдо рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдмрд╕реЗ рдХрдо рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреБрд▓ рдЖрдХрд╛рд░ рдПрдо / рдПрди (рдЬрд╣рд╛рдВ рдПрди рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛ)ред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрди рдЬреЛрдбрд╝реЗ рдХреЗ рдЖрдХрд╛рд░ рдПрдо / рдПрди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдВрдЧреЗ ред

рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, M рдХреЛ N рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдФрд░ рдЕрдЧрд░ рд╣рдореЗрдВ рдпрд╛рдж рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ M = 2 ^ k рд╣реИ , рддреЛ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рдЖрдХрд╛рд░ рднреА рджреЛ рдХреА рд╢рдХреНрддрд┐ рд╣реИред рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рд╢реВрдиреНрдп рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЕрдкреНрд░рдпреБрдХреНрдд рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд╛рдВрдЫрд┐рдд рдЖрдХрд╛рд░ рдореЗрдВ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЛ рдкреВрд░рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЪрд░рд┐рддреНрд░ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рдХрдИ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЛрдбрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдЕрдзрд┐рдХ рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдПрдлрдПрд╕рдИ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╣рд╛рдВ рдЕрдВрддрд░рд╛рд▓ рдЖрдо рддреМрд░ рдкрд░ рдкреВрд░реА рд░реЗрдВрдЬ рдореЗрдВ рдлреИрд▓реЗ рд╣реБрдП рдереЗ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдкрд╛рдЧрд▓ рдорд┐рдХреНрд╕рд░ рдиреЗ рдЙрди рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдХреБрдЫ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ =)

рд╡рд╛рдВрдЫрд┐рдд рдЕрдВрддрд░рд╛рд▓ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ: рдПрдХреНрд╕ рдХреЛ рдПрди рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдЬреЛрдбрд╝реЗ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЧрд┐рд░реЗрдВред рдЕрдЧрд▓рд╛, рд╣рдо рдПрдХ рдЬреЛрдбрд╝реА рдореЗрдВ рдЦрдВрдбреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде x% N рдХреЗ рд╢реЗрд╖ рднрд╛рдЧ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдВрддрд░рд╛рд▓ рдпрд╛ рджреВрд╕рд░реЗ рдореЗрдВ рдЧрд┐рд░рддреЗ рд╣реИрдВред

рд╣рдо рдЕрднреНрдпрд╛рд╕ рдореЗрдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ


рд╣рдо рд╕рдорд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рд╣рдо рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рд▓реЗрддреЗ рд╣реИрдВ:
 size_t in_size; uint8_t* in_bytes = read_file("book1", &in_size); 

1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдирд┐рд░реНрдгрдп рд▓реЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдмрд╛рдЗрдЯ рдХреЛ рдХреВрдЯрдмрджреНрдз рдХрд░реЗрдВрдЧреЗ [0 ... 255]ред

2. рдЕрдЧрд▓рд╛ рдХрджрдо рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╡рд░реНрдгреЛрдВ рдХреА рдЖрд╡реГрддреНрддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ:

(рдлрдВрдХреНрд╢рди stats.count_freqs )
 for (size_t i = 0; i < in_size; i++) {   freqs[in_bytes[i]]++; } 

3. рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддреАрдХ рдЖрд╡реГрддреНрддрд┐рдпрд╛рдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛рдиреА рдЖрдиреБрдкрд╛рддрд┐рдХ рд░реВрдк рд╕реЗ рдХрдо (рдпрд╛ рд╡реГрджреНрдзрд┐) рддрд╛рдХрд┐ рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ рд╣рдореЗрдВ M = 2 ^ k рдорд┐рд▓реЗред рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдХрд╛рдо рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдХрд┐ рдпрд╣ рдкреНрд░рддреАрдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

 stats.normalize_freqs(...); 

рд╡реИрд╕реЗ, рдЖрдкрдХреЛ k рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЪреВрдБрдХрд┐ рд╣рдорд╛рд░реА рд╡рд░реНрдгрдорд╛рд▓рд╛ рдореЗрдВ 256 рдЕрдХреНрд╖рд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП k рдХреЛ 8 рд╕реЗ рдХрдо рдирд╣реАрдВ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдзрд┐рдХрддрдо - 16 рд▓реЗрдВ, рдФрд░ рдмрд╛рдж рдореЗрдВ рдЕрдиреНрдп рдорд╛рди рдЖрдЬрд╝рдорд╛рдПрдБред

4. рдирд┐рд░реНрдорд╛рдг рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛ :

 stats.make_alias_table(); 

5. рд╣рдо рдЕрдВрдд рд╕реЗ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ , рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд░рдо рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд░рддреЗ рд╣реИрдВред

 RansState rans; //  rANS,    x RansEncInit(&rans); //    uint8_t* ptr = out_buf + out_max_size; // *end* of output buffer for (size_t i = in_size; i > 0; i--) { // NB: working in reverse!   int s = in_bytes[i - 1];   RansEncPutAlias(&rans, &ptr, &stats, s, prob_bits); } //   .     . RansEncFlush(&rans, &ptr); 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдВрджрд░реНрдн рджреНрд╡рд╛рд░рд╛ рдЙрджрд╛рд╣рд░рдг рддреИрдпрд╛рд░ рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рдореЗрдВ, рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЖрд╡реГрддреНрддрд┐рдпреЛрдВ (рдЖрдБрдХрдбрд╝реЗ) рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЗрд╕ рдкрд░ N * k рдмрд┐рдЯреНрд╕ рдЦрд░реНрдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдЗрдП k рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрдкреАрдбрд╝рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦреЗрдВ (рдХреЛрдб рдореЗрдВ рдпрд╣ prob_bits ), рдЖрд╡реГрддреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП:

( рдореВрд▓ рдХрд┐рддрд╛рдм 1 рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ : 768771)
k = 16: 435059 + 512 = 435571 рдмрд╛рдЗрдЯреНрд╕
k = 15 : 435078 + 480 = 435558 рдмрд╛рдЗрдЯреНрд╕
k = 14: 435113 + 448 = 435561 рдмрд╛рдЗрдЯреНрд╕
k = 13: 435239 + 416 = 435655 рдмрд╛рдЗрдЯреНрд╕
k = 12: 435603 + 384 = 435987 рдмрд╛рдЗрдЯреНрд╕
k = 11: 436530 + 352 = 436882 рдмрд╛рдЗрдЯреНрд╕
k = 10: 440895 + 320 = 441215 рдмрд╛рдЗрдЯреНрд╕
k = 9: 453418 + 288 = 453706 рдмрд╛рдЗрдЯреНрд╕
k = 8: 473126 + 256 = 473382 рдмрд╛рдЗрдЯреНрд╕

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдЪреНрдЪ k, рдмреЗрд╣рддрд░ рд╕рдВрдкреАрдбрд╝рдиред рд▓реЗрдХрд┐рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдкрд░ (k = 16 рдкрд░), рдЖрд╡реГрддреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХрд╛ рдУрд╡рд░рд╣реЗрдб рдмрдврд╝рддреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд▓рд╛рднреЛрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ рдЫреЛрдЯреА рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреНрд░рднрд╛рд╡ рдЫреЛрдЯреЗ k рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред

рдЖрдкрдХреЛ "рдЗрдВрдЯрд░рд▓реАрд╡реНрдб рдЖрд░рдПрдПрдирдПрд╕" рдирд╛рдордХ рдЪрд╛рд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж рднреА рдХрд╣рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реИ ред рдпрд╣ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдХрд┐ рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░рд╛рдЬреНрдп рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдорд╛рдирддрд╛ рдХрд╛ рдмреЗрд╣рддрд░ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред рдирддреАрдЬрддрди, рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдФрд░ рднреА рддреЗрдЬ рд╣реИред

рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдпрд╣ рдиреЛрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдЪрдпрдирд┐рдд рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкреАрдбрд╝рди рд╡рд┐рдзрд┐ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ, рдпрд╣реА рд╡рдЬрд╣ рд╣реИ рдХрд┐ рд╕рдВрдкреАрдбрд╝рди рдЗрд╖реНрдЯрддрдо рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрдирдкреБрдЯ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдЕрдХреНрд╖рд░ рд╕рдВрдпреЛрдЬрди рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдФрд░ рдХреБрдЫ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрдереНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕рдВрдкреАрдбрд╝рди рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред

рдЕрдВрддрднрд╛рд╖рдг


рдЬрдм рдХрдИ рд╕рдордп-рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рд╣реИрдВ рддреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрднрд┐рд▓реЗрдЦрд╛рдЧрд╛рд░ рдХреЛ рдХреНрдпреЛрдВ рд▓рд┐рдЦреЗрдВ? рдЗрд╕рдХрд╛ рдЙрддреНрддрд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ: рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЕрдиреБрд░реВрдк рдЖрд░реНрдХрд╛рдЗрд╡ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдкреАрдбрд╝рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред

Playrix рдореЗрдВ рдЧреЗрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдЕрдХреНрд╕рд░ рдмрд┐рд▓реНрдб рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЦреЗрд▓ рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рд╕рд╛рдордЧреНрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдмрдврд╝ рд░рд╣реА рд╣реИ, рдФрд░ рд╕реНрдерд╛рди рд╕реАрдорд┐рдд рд╣реИред

рдПрдХ рдмрд╛рд░ рдлрд┐рд░ , рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдордиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХреБрдЫ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдЙрдирдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЬрд╝рд┐рдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдХреБрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рджреМрд░рд╛рди, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдиреАрдореЗрд╢рди рдкреНрд░рд╛рд░реВрдк рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрд╛рдлреА рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рдВрдкреАрдбрд╝рди рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рднреА рд╣реИрдВред

рд╕рдВрдкреАрдбрд╝рди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдПрдиреНрдЯреНрд░рд╛рдкреА рдПрдирдХреЛрдбрд░, рдЬреИрд╕реЗ рдХрд┐ рдЖрд░рдПрдПрдирдПрд╕ рдпрд╛ рдПрдлрдПрд╕рдИ, рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрдкрдХрд░рдг рд╣реИред рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрдо рд╕реЗ рдХрдо рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд░реНрдг рд▓рд┐рдЦрдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдореБрдЦреНрдп рд╡рд┐рд╡рд░рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рджреЛрдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдЖрдкрдХреЛ rANS рдХреЛ рдЬрд╛рдирдиреЗ рдФрд░ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рд╕рдВрджрд░реНрдн


рдпрд╣рд╛рдВ рдЖрдк rANS рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдХрд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдХреВрд▓рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде):

рдлреИрдмрд┐рдпрди рдЧрд┐рд╕реЗрди: github.com/rygorous/ryg_rans

рдЖрдк рдлреИрдмрд┐рдпрди рдХреЗ рдмреНрд▓реЙрдЧ (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ) рдкрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╡рд░рдг рдФрд░ рд╡рд┐рд╡рд░рдг рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ:

тЖТ rANS рдиреЛрдЯ
тЖТ рд╕реНрдерд┐рд░ рд╕рдВрднрд╛рд╡рдирд╛ рд╡рд┐рддрд░рдг рдХреЗ рд╕рд╛рде rANS
тЖТ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ rANS

Source: https://habr.com/ru/post/hi441814/


All Articles