рджреВрд╕рд░реЗ рджрд┐рди, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди Google рдореЗрдВ рдПрдХ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдиреЗ рдХреБрдЫ рднреА рд╕рд╛рд░реНрдердХ рдирд╣реАрдВ рджрд┐рдпрд╛ред рдХреЗрд╡рд▓ рдПрдХ
рд▓реЗрдЦ рд╣реИрдмреЗ рдкрд░ рдкрд╛рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореЗрд░реА рдорджрдж рдирд╣реАрдВ рдХреАред рд╕рдордЭрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдЬрдирддрд╛ рдХреЗ рд╕рд╛рде рд╕реБрд▓рдн рд░реВрдк рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
Karatsuba рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рдПрди
рд▓реЙрдЧ 2 3 рдХреЗ рд╕рд╛рде рдПрдХ рддреНрд╡рд░рд┐рдд рдЧреБрдгрди рд╡рд┐рдзрд┐ рд╣реИред рдЬрдмрдХрд┐ рднреЛрд▓реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рдХреЙрд▓рдо рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП n
2 рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЬрдм рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд▓рдВрдмрд╛рдИ рдХрдИ рджрд╕рд┐рдпреЛрдВ рд╡рд░реНрдгреЛрдВ рд╕реЗ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд), рд╕рд╛рдзрд╛рд░рдг рдЧреБрдгрдХ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдХреБрдЫ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА B рдореЗрдВ рджреЛ рд╕рдВрдЦреНрдпрд╛ A рдФрд░ B рдХреА рд▓рдВрдмрд╛рдИ n рд╣реИ:
рдП = рдПрдХ
рдПрди -1 рдП
рдПрди -2 ... рдПрдХ
режB = b
n-1 a
n-2 ...
0 , рдХрд╣рд╛рдБ a
? рдмреА
? - рдорд╛рди рдПрд╕реАрд╕реАред рдбрд┐рд╕реНрдЪрд╛рд░реНрдЬ рдЕрдВрдХред
рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЙрдирдХреЗ рджреЛ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓рдВрдмрд╛рдИ m = n / 2 рдХреЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ (рдпрджрд┐ n рд╡рд┐рд╖рдо рд╣реИ, рддреЛ рдПрдХ рднрд╛рдЧ рдПрдХ рдЕрдВрдХ рд╕реЗ рджреВрд╕рд░реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реИ:
рдПрдХ
0 = рдПрдХ
рдПрдо -1 рдПрдХ
рдПрдо -2 ... рдПрдХ
0рдП
1 = рдП
рдПрди -1 рдП
рдПрди -2 ... рдП
рдПрдоA = A
0 + A
1 * рдЖрдзрд╛рд░
рдореАB
0 = b
m-1 b
m-2 ... b
0рдмреА
1 = рдмреА
рдПрди -1 рдмреА
рдПрди -2 -2 ... рдмреА
рдПрдордмреА = рдмреА
0 + рдмреА
1 * рдЖрдзрд╛рд░
рдореАрддрдм: A * B =
(A 0 + A 1 * BASE m ) * (B 0 + B 1 * BASE m ) =
A 0 * B 0 + A 0 * B 1 * BASE m + A 1 * B 0 * BASE m + A 1 * B 1 * BASE 2 * m =
A 0 * B 0 + ( A 0 * B 1 + A 1 * B 0 ) * BASE m + A 1 * B 1 * BASE 2 * mрдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдЧреБрдгрди рдХреЗ 4 рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рд╕реВрддреНрд░ рдХреЗ рднрд╛рдЧ * рдЖрдзрд╛рд░
? * M рдЧреБрдгрд╛ рдирд╣реАрдВ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреА рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдЬрдЧрд╣ рдХрд╛ рд╕рдВрдХреЗрдд рд╣реИ, рдирд┐рд░реНрд╡рд╣рди)ред рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░:
(A
0 + A
1 ) * (B
0 + B
1 ) =
A 0 * B 0 +
A 0 * B 1 + A 1 * B 0 +
A 1 * B 1рджреЛрдиреЛрдВ рд╕реВрддреНрд░реЛрдВ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЧрдП рднрд╛рдЧреЛрдВ рдХреЛ рджреЗрдЦрдХрд░ред рд╕рд░рд▓ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдЧреБрдгрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 3 рддрдХ рдШрдЯрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИ, рджреЛ рдЧреБрдгрд╛рдУрдВ рдХреЛ рдПрдХ рдФрд░ рдХрдИ рдЬреЛрдбрд╝ рдФрд░ рдШрдЯрд╛рд╡ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдкрд░рд┐рдорд╛рдг рдХрд╛ рдПрдХ рдХреНрд░рдо рдХрдо рд╣реИ:
A 0 * B 1 + A 1 * B 0 =
(A 0 + A 1 ) * (B 0 + B 1 ) - A 0 * B 0 - A 1 * B 1рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЕрдВрддрд┐рдо рд░реВрдк:
A * B =
A 0 * B 0 + ((A 0 + A 1 ) * (B 0 + B 1 ) - A 0 * B 0 - A 1 * B 1 ) * BASE m + A 1 * B 1 * BASE 2 * рдореАрдЪрд┐рддреНрд░рдордп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡:
рдЙрджрд╛рд╣рд░рдг
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА 12345 рдФрд░ 98765 рдореЗрдВ рджреЛ рдЖрда рдЕрдВрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ:

рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдкреБрдирд░рд╛рд╡рд░реНрддреА рдкреНрд░рдХреГрддрд┐ рдЫрд╡рд┐ рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рдЪрд╛рд░ рдЕрдВрдХреЛрдВ рд╕реЗ рдХрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП, рднреЛрд▓реЗ рдЧреБрдгрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
C ++ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕рдВрднрд╡рддрдпрд╛ рдЗрд╕рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХрд┐рддрдиреА рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдПрдХ рдЕрдВрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдЪрд▓реЗ рдЕрдВрдХ рдХрдо рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ (рдпрд╛рдиреА, рдмреИрдХ-рдЯреВ-рдмреИрдХ) рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛрддреЗ рд╣реИрдВ - рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
int long_value[] = { 9, 8, 7, 6, 5, 4} // 456789
рдкреНрд░рджрд░реНрд╢рди рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рднреАрддрд░ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрд╕ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд░реНрддреЗрдВ рд▓рдЧрд╛рдИ рдЬрд╛рддреА рд╣реИрдВ:
- рдЪрдпрдирд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╡рд░реНрдЧ рдЪрдпрдирд┐рдд рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рд╢реНрд░реЗрдгреА рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
- рдЪрдпрдирд┐рдд рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рд▓реЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рдордзреНрдпрд╡рд░реНрддреА рд╕рд╛рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
- рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЛ рдирд┐рд░реНрд╡рд╣рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред рдЗрд╕рд╕реЗ рдХрдИ рдордзреНрдпрд╡рд░реНрддреА рд╕рд╛рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗрдЧрд╛ред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рд╣рд╛рдпрдХ рдШреЛрд╖рдгрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдп рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдВрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░, рдФрд░ рднреЛрд▓реЗ рдЧреБрдгрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЬрдЧрд╣ рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХреЛрдб рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
- # рдЕрд▓рдЧ рдХрд░рдирд╛ <cstring>
- #define рдЖрдзрд╛рд░ 10 // рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА
- #define MIN_LENGTH_FOR_KARATSUBA 4 // рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреНрд╡рд┐рдШрд╛рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- typedef int digit; // рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛
- typedef рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ int size_length; // рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ
- рдирд╛рдо рд╕реНрдерд╛рди std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ;
- рд╕рдВрд░рдЪрдирд╛ long_value { // рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ
- рдЕрдВрдХ * рдорд╛рди; // рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА
- size_length рд▓рдВрдмрд╛рдИ; // рд╕рдВрдЦреНрдпрд╛ рд▓рдВрдмреА рд╣реИ
- };
- long_value sum (long_value a, long_value b) {
- / * рджреЛ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рдХреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИрдВ
- * рдлрд┐рд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
- * рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ред
- * /
- long_value s;
- s.length = a.length + 1;
- s.values тАЛтАЛ= рдирдпрд╛ рдЕрдВрдХ [s.length];
- s.values тАЛтАЛ[a.length - 1] = a.values тАЛтАЛ[a.length - 1];
- s.values тАЛтАЛ[a.length] = 0;
- for (size_length i = 0; рдореИрдВ <b.length; ++ i)
- s.values тАЛтАЛ[i] = a.values тАЛтАЛ[i] + b.values тАЛтАЛ[i];
- рд╡рд╛рдкрд╕реА ;
- }
- long_value рдФрд░ рдЙрдк (long_value & a, long_value b) {
- / * рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдПрдХ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдШрдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпред рдкрд╣рд▓реЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
- * рд╕рдВрдЦреНрдпрд╛ред рдкрд╣рд▓реЗ рдирдВрдмрд░ рдкрд░ рдПрдХ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд╣реАрдВ рд╣реИред
- * /
- for (size_length i = 0; рдореИрдВ <b.length; ++ i)
- a.values тАЛтАЛ[i] - = b.values тАЛтАЛ[i];
- рдПрдХ рд╡рд╛рдкрд╕реА ;
- }
- рд╢реВрдиреНрдп рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (long_value l) {
- / * рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг - рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рд▓рд╛рдирд╛ред
- *
- * /
- for (size_length i = 0; i <l.length - 1; ++ i) {
- рдЕрдЧрд░ (l.values тАЛтАЛ[i]> = BASE) { // рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
- рдбрд┐рдЬрд┐рдЯ рдХреИрд░реАрдУрд╡рд░ = l.values тАЛтАЛ[i] / BASE;
- l.values тАЛтАЛ[i + 1] + = рд╡рд╣рди;
- l.values тАЛтАЛ[i] - = carryover * рдЖрдзрд╛рд░;
- } рдФрд░ рдЕрдЧрд░ (l.values тАЛтАЛ[i] <0) { // рдЕрдЧрд░ рдХрдо рд╣реИ, рддреЛ рдПрдХ рдЛрдг
- рдбрд┐рдЬрд┐рдЯ рдХреИрд░реАрдУрд╡рд░ = (l.values тАЛтАЛ[i] + 1) / BASE - 1;
- l.values тАЛтАЛ[i + 1] + = рд╡рд╣рди;
- l.values тАЛтАЛ[i] - = carryover * рдЖрдзрд╛рд░;
- }
- }
- }
- long_value karatsuba (long_value a, long_value b) {
- long_value рдЙрддреНрдкрд╛рдж; // рдкрд░рд┐рдгрд╛рдореА рдЙрддреНрдкрд╛рдж
- product.length = a.length + b.length;
- product.values тАЛтАЛ= new digit [product.length];
- рдпрджрд┐ (a.length <MIN_LENGTH_FOR_KARATSUBA) { // рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЫреЛрдЯреА рд╣реИ рддреЛ рднреЛрд▓реЗ рдЧреБрдгрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ
- рдореЗрдорд╕реЗрдЯ (рдЙрддреНрдкрд╛рдж.рд╡реИрд▓реНрдпреВрдЬрд╝, 0, рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ (рдЕрдВрдХ) * рдЙрддреНрдкрд╛рдж.рд▓рд┐рдлреНрдЯ)
- for (size_length i = 0; рдореИрдВ <a.length; ++ i)
- for (size_length j = 0; j <b.length; ++ j) {
- product.values тАЛтАЛ[i + j] + = a.values тАЛтАЛ[i] * b.values тАЛтАЛ[j];
- / * рдпрджрд┐ рдЖрдк MIN_LENGTH_FOR_KARATSUBA рдпрд╛ BASE рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
- * рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рдПрд╕реАрд╕реА рдЙрдард╛ред рдорд╛рди рдмрд┐рдЯреНрд╕ рдХреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
- * рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ 100 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ
- * рдПрдХ рдбрд┐рд╕реНрдЪрд╛рд░реНрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 1 рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, 200 - 2 рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдПрдХ рдбрд┐рд╕реНрдЪрд╛рд░реНрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, 5000 - 5 рджреЛ рдХреЗ рдмрд╛рджред
- * рдЕрдЧрд░ (product.values тАЛтАЛ[i + j]> = 100) {
- * product.values тАЛтАЛ[i + j] - = 100;
- * product.values тАЛтАЛ[i + j + 2] + = 1;
- *}
- * /
- }
- } рдФрд░ { // рдХрд░рддреНрд╕реБрдмрд╛ рдЧреБрдгрди
- long_value a_part1; // рдХрд╛ рдирд┐рдЪрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛
- a_part1.values тАЛтАЛ= a.values;
- a_part1.length = (a.length + 1) / 2;
- long_value a_part2; // рдЙрдЪреНрдЪ рднрд╛рдЧ рдП
- a_part2.values тАЛтАЛ= a.values тАЛтАЛ+ a_part1.length;
- a_part2.length = a.length / 2;
- long_value b_part1; // рдмреА рдХрд╛ рдирд┐рдЪрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛
- b_part1.values тАЛтАЛ= b.values;
- b_part1.length = (b.length + 1) / 2;
- long_value b_part2; // рдЙрдЪреНрдЪ рднрд╛рдЧ b
- b_part2.values тАЛтАЛ= b.values тАЛтАЛ+ b_part1.length;
- b_part2.length = b.length / 2;
- long_value sum_of_a_parts = sum (a_part1, a_part2); // рдПрдХ рдХреЗ рднрд╛рдЧреЛрдВ рдХрд╛ рдпреЛрдЧ
- рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (sum_of_a_parts);
- long_value sum_of_b_parts = sum (b_part1, b_part2); // рд╕рдВрдЦреНрдпрд╛ рдмреА рдХреЗ рднрд╛рдЧреЛрдВ рдХрд╛ рдпреЛрдЧ
- рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (sum_of_b_parts);
- long_value product_of_sums_of_parts = karatsuba (sum_of_a_parts, sum_of_b_parts);
- // рднрд╛рдЧреЛрдВ рдХреА рд░рдХрдо рдХрд╛ рдЙрддреНрдкрд╛рдж
- long_value product_of_first_parts = karatsuba (a_part1, b_part1); // рдЬреВрдирд┐рдпрд░ рд╕рджрд╕реНрдп
- long_value product_of_second_parts = karatsuba (a_part2, b_part2); // рд╡рд░рд┐рд╖реНрда рд╕рджрд╕реНрдп
- long_value sum_of_middle_terms = рдЙрдк (рдЙрдк (product_of_sums_of_parts, product_of_first_parts), product_of_second_parts);
- // рдордзреНрдп рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдпреЛрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛
- / *
- * рдмрд╣реБрдкрдж рдХрд╛ рдпреЛрдЧ
- * /
- memcpy (product.values, product_of_first_parts.values)
- product_of_first_parts.length * sizeof (рдЕрдВрдХ));
- memcpy (product.values тАЛтАЛ+ product_of_first_parts.length,
- product_of_second_parts.values, product_of_second_parts.length
- * рдЖрдХрд╛рд░ (рдЕрдВрдХ);
- for (size_length i = 0; рдореИрдВ <sum_of_middle_terms.length; ++ i)
- product.values тАЛтАЛ[a_part1.length + i] + = sum_of_middle_terms.values тАЛтАЛ[i];
- / *
- * рдзрд╛рд░реАрджрд╛рд░
- * /
- рд╣рдЯрд╛рдПрдВ [] sum_of_a_parts.values;
- рд╣рдЯрд╛рдПрдВ [] sum_of_b_parts.values;
- рд╣рдЯрд╛рдПрдВ [] product_of_sums_of_parts.values;
- рд╣рдЯрд╛рдПрдВ [] product_of_first_parts.values;
- рд╣рдЯрд╛рдПрдВ [] product_of_second_parts.values;
- }
- рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (рдЙрддреНрдкрд╛рдж); // рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг
- рд╡рд╛рдкрд╕реА рдЙрддреНрдкрд╛рдж;
- }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред