рдХрд░рддреНрд╕реБрдмрд╛ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЧреБрдгрди

рджреВрд╕рд░реЗ рджрд┐рди, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рд▓реЗрдХрд┐рди 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
рдкреНрд░рджрд░реНрд╢рди рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рднреАрддрд░ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрд╕ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд░реНрддреЗрдВ рд▓рдЧрд╛рдИ рдЬрд╛рддреА рд╣реИрдВ:
  1. рдЪрдпрдирд┐рдд рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╡рд░реНрдЧ рдЪрдпрдирд┐рдд рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдордзреНрдпрд╡рд░реНрддреА рдЧрдгрдирд╛ рдореЗрдВ рдПрдХ рд╢реНрд░реЗрдгреА рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЛ рджреВрд╕рд░реЗ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
  2. рдЪрдпрдирд┐рдд рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рд▓реЗрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рдордзреНрдпрд╡рд░реНрддреА рд╕рд╛рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
  3. рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдХрдИ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдпреЛрдЧ рдХреЛ рдирд┐рд░реНрд╡рд╣рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдПред рдЗрд╕рд╕реЗ рдХрдИ рдордзреНрдпрд╡рд░реНрддреА рд╕рд╛рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓реЗрдЧрд╛ред


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рд╣рд╛рдпрдХ рдШреЛрд╖рдгрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдп рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдВрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░, рдФрд░ рднреЛрд▓реЗ рдЧреБрдгрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдЬрдЧрд╣ рдореЗрдВ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХреЛрдб рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
  1. # рдЕрд▓рдЧ рдХрд░рдирд╛ <cstring>
  2. #define рдЖрдзрд╛рд░ 10 // рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА
  3. #define MIN_LENGTH_FOR_KARATSUBA 4 // рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреНрд╡рд┐рдШрд╛рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдЧреБрдгрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  4. typedef int digit; // рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдпрд╛ рдЧрдпрд╛
  5. typedef рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ int size_length; // рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ
  6. рдирд╛рдо рд╕реНрдерд╛рди std рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ ;
  7. рд╕рдВрд░рдЪрдирд╛ long_value { // рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ
  8. рдЕрдВрдХ * рдорд╛рди; // рдЙрд▓реНрдЯреЗ рдХреНрд░рдо рдореЗрдВ рд▓рд┐рдЦреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдВрдХреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд░рдгреА
  9. size_length рд▓рдВрдмрд╛рдИ; // рд╕рдВрдЦреНрдпрд╛ рд▓рдВрдмреА рд╣реИ
  10. };
  11. long_value sum (long_value a, long_value b) {
  12. / * рджреЛ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рдВрдмрд╛рдИ рдХреА рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИрдВ
  13. * рдлрд┐рд░ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ
  14. * рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛ред
  15. * /
  16. long_value s;
  17. s.length = a.length + 1;
  18. s.values тАЛтАЛ= рдирдпрд╛ рдЕрдВрдХ [s.length];
  19. s.values тАЛтАЛ[a.length - 1] = a.values тАЛтАЛ[a.length - 1];
  20. s.values тАЛтАЛ[a.length] = 0;
  21. for (size_length i = 0; рдореИрдВ <b.length; ++ i)
  22. s.values тАЛтАЛ[i] = a.values тАЛтАЛ[i] + b.values тАЛтАЛ[i];
  23. рд╡рд╛рдкрд╕реА ;
  24. }
  25. long_value рдФрд░ рдЙрдк (long_value & a, long_value b) {
  26. / * рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдПрдХ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдШрдЯрд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдпред рдкрд╣рд▓реЗ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ
  27. * рд╕рдВрдЦреНрдпрд╛ред рдкрд╣рд▓реЗ рдирдВрдмрд░ рдкрд░ рдПрдХ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд╣реАрдВ рд╣реИред
  28. * /
  29. for (size_length i = 0; рдореИрдВ <b.length; ++ i)
  30. a.values тАЛтАЛ[i] - = b.values тАЛтАЛ[i];
  31. рдПрдХ рд╡рд╛рдкрд╕реА ;
  32. }
  33. рд╢реВрдиреНрдп рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (long_value l) {
  34. / * рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг - рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрдХ рд▓рд╛рдирд╛ред
  35. *
  36. * /
  37. for (size_length i = 0; i <l.length - 1; ++ i) {
  38. рдЕрдЧрд░ (l.values тАЛтАЛ[i]> = BASE) { // рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╛ рдЖрдпреЛрдЬрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
  39. рдбрд┐рдЬрд┐рдЯ рдХреИрд░реАрдУрд╡рд░ = l.values тАЛтАЛ[i] / BASE;
  40. l.values тАЛтАЛ[i + 1] + = рд╡рд╣рди;
  41. l.values тАЛтАЛ[i] - = carryover * рдЖрдзрд╛рд░;
  42. } рдФрд░ рдЕрдЧрд░ (l.values тАЛтАЛ[i] <0) { // рдЕрдЧрд░ рдХрдо рд╣реИ, рддреЛ рдПрдХ рдЛрдг
  43. рдбрд┐рдЬрд┐рдЯ рдХреИрд░реАрдУрд╡рд░ = (l.values тАЛтАЛ[i] + 1) / BASE - 1;
  44. l.values тАЛтАЛ[i + 1] + = рд╡рд╣рди;
  45. l.values тАЛтАЛ[i] - = carryover * рдЖрдзрд╛рд░;
  46. }
  47. }
  48. }
  49. long_value karatsuba (long_value a, long_value b) {
  50. long_value рдЙрддреНрдкрд╛рдж; // рдкрд░рд┐рдгрд╛рдореА рдЙрддреНрдкрд╛рдж
  51. product.length = a.length + b.length;
  52. product.values тАЛтАЛ= new digit [product.length];
  53. рдпрджрд┐ (a.length <MIN_LENGTH_FOR_KARATSUBA) { // рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЫреЛрдЯреА рд╣реИ рддреЛ рднреЛрд▓реЗ рдЧреБрдгрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ
  54. рдореЗрдорд╕реЗрдЯ (рдЙрддреНрдкрд╛рдж.рд╡реИрд▓реНрдпреВрдЬрд╝, 0, рд╕рд╛рдЗрдЬрд╝реЛрдлрд╝ (рдЕрдВрдХ) * рдЙрддреНрдкрд╛рдж.рд▓рд┐рдлреНрдЯ)
  55. for (size_length i = 0; рдореИрдВ <a.length; ++ i)
  56. for (size_length j = 0; j <b.length; ++ j) {
  57. product.values тАЛтАЛ[i + j] + = a.values тАЛтАЛ[i] * b.values тАЛтАЛ[j];
  58. / * рдпрджрд┐ рдЖрдк MIN_LENGTH_FOR_KARATSUBA рдпрд╛ BASE рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
  59. * рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рдПрд╕реАрд╕реА рдЙрдард╛ред рдорд╛рди рдмрд┐рдЯреНрд╕ рдХреЗ рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред
  60. * рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджрд╢рдорд▓рд╡ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ 100 рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд╣реИ
  61. * рдПрдХ рдбрд┐рд╕реНрдЪрд╛рд░реНрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 1 рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, 200 - 2 рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдПрдХ рдбрд┐рд╕реНрдЪрд╛рд░реНрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, 5000 - 5 рджреЛ рдХреЗ рдмрд╛рджред
  62. * рдЕрдЧрд░ (product.values тАЛтАЛ[i + j]> = 100) {
  63. * product.values тАЛтАЛ[i + j] - = 100;
  64. * product.values тАЛтАЛ[i + j + 2] + = 1;
  65. *}
  66. * /
  67. }
  68. } рдФрд░ { // рдХрд░рддреНрд╕реБрдмрд╛ рдЧреБрдгрди
  69. long_value a_part1; // рдХрд╛ рдирд┐рдЪрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛
  70. a_part1.values тАЛтАЛ= a.values;
  71. a_part1.length = (a.length + 1) / 2;
  72. long_value a_part2; // рдЙрдЪреНрдЪ рднрд╛рдЧ рдП
  73. a_part2.values тАЛтАЛ= a.values тАЛтАЛ+ a_part1.length;
  74. a_part2.length = a.length / 2;
  75. long_value b_part1; // рдмреА рдХрд╛ рдирд┐рдЪрд▓рд╛ рд╣рд┐рд╕реНрд╕рд╛
  76. b_part1.values тАЛтАЛ= b.values;
  77. b_part1.length = (b.length + 1) / 2;
  78. long_value b_part2; // рдЙрдЪреНрдЪ рднрд╛рдЧ b
  79. b_part2.values тАЛтАЛ= b.values тАЛтАЛ+ b_part1.length;
  80. b_part2.length = b.length / 2;
  81. long_value sum_of_a_parts = sum (a_part1, a_part2); // рдПрдХ рдХреЗ рднрд╛рдЧреЛрдВ рдХрд╛ рдпреЛрдЧ
  82. рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (sum_of_a_parts);
  83. long_value sum_of_b_parts = sum (b_part1, b_part2); // рд╕рдВрдЦреНрдпрд╛ рдмреА рдХреЗ рднрд╛рдЧреЛрдВ рдХрд╛ рдпреЛрдЧ
  84. рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (sum_of_b_parts);
  85. long_value product_of_sums_of_parts = karatsuba (sum_of_a_parts, sum_of_b_parts);
  86. // рднрд╛рдЧреЛрдВ рдХреА рд░рдХрдо рдХрд╛ рдЙрддреНрдкрд╛рдж
  87. long_value product_of_first_parts = karatsuba (a_part1, b_part1); // рдЬреВрдирд┐рдпрд░ рд╕рджрд╕реНрдп
  88. long_value product_of_second_parts = karatsuba (a_part2, b_part2); // рд╡рд░рд┐рд╖реНрда рд╕рджрд╕реНрдп
  89. long_value sum_of_middle_terms = рдЙрдк (рдЙрдк (product_of_sums_of_parts, product_of_first_parts), product_of_second_parts);
  90. // рдордзреНрдп рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рдпреЛрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛
  91. / *
  92. * рдмрд╣реБрдкрдж рдХрд╛ рдпреЛрдЧ
  93. * /
  94. memcpy (product.values, product_of_first_parts.values)
  95. product_of_first_parts.length * sizeof (рдЕрдВрдХ));
  96. memcpy (product.values тАЛтАЛ+ product_of_first_parts.length,
  97. product_of_second_parts.values, product_of_second_parts.length
  98. * рдЖрдХрд╛рд░ (рдЕрдВрдХ);
  99. for (size_length i = 0; рдореИрдВ <sum_of_middle_terms.length; ++ i)
  100. product.values тАЛтАЛ[a_part1.length + i] + = sum_of_middle_terms.values тАЛтАЛ[i];
  101. / *
  102. * рдзрд╛рд░реАрджрд╛рд░
  103. * /
  104. рд╣рдЯрд╛рдПрдВ [] sum_of_a_parts.values;
  105. рд╣рдЯрд╛рдПрдВ [] sum_of_b_parts.values;
  106. рд╣рдЯрд╛рдПрдВ [] product_of_sums_of_parts.values;
  107. рд╣рдЯрд╛рдПрдВ [] product_of_first_parts.values;
  108. рд╣рдЯрд╛рдПрдВ [] product_of_second_parts.values;
  109. }
  110. рд╕рд╛рдорд╛рдиреНрдп рдХрд░реЗрдВ (рдЙрддреНрдкрд╛рдж); // рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг
  111. рд╡рд╛рдкрд╕реА рдЙрддреНрдкрд╛рдж;
  112. }
* рдЗрд╕ рд╕реЛрд░реНрд╕ рдХреЛрдб рдХреЛ рд╕реЛрд░реНрд╕ рдХреЛрдб рд╣рд╛рдЗрд▓рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

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


All Articles