Microsoft рд▓рдВрдмрд╛ рдЕрдВрдХрдЧрдгрд┐рдд

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


рдпрд╣ рдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдЙрди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рдирдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдорд┐рдд рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо 32-рдмрд┐рдЯ рдФрд░ 64-рдмрд┐рдЯ рдкреВрд░реНрдгрд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ .NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдХреНрд░рдорд╢рдГ Int32 (int) рдФрд░ Int64 (long) рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВред

рдФрд░ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ рдЕрдЧрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐, 29! = 884176199373970195954361616000000? рдРрд╕реА рд╕рдВрдЦреНрдпрд╛ 64-рдмрд┐рдЯ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрдЧреА, 32-рдмрд┐рдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдмрд╣реБрдд рдХрдо рд╣реИред рдпрд╣ рдЗрддрдиреА рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдПрдХ рд▓рдВрдмреА рдЕрдВрдХрдЧрдгрд┐рдд рд╣реИред

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

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

рд╕рдВрд╕реНрдХрд░рдг 4.0 рддрдХ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЗрдВ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдорд░реНрдерди рдирд╣реАрдВ рдерд╛ред 4 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, .NET рдиреЗ рди рдХреЗрд╡рд▓ рд▓рдВрдмреЗ рд╕рдордп рддрдХ, рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рднреА рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛ред рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ System.Numerics рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ рдФрд░ BigInteger рдФрд░ Complex рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд╕рдорд╛рди рдирд╛рдо рдХреЗ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ BigInteger рд╕рдВрд░рдЪрдирд╛ .NET 3.5 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдереА, рд▓реЗрдХрд┐рди рдЙрд╕ рд╕рдордп рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддреИрдпрд╛рд░ рдирд╣реАрдВ рдереА, рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ (рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рдерд╛), рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ .NET рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред 4.0ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ Microsoft рд╕реЗ рд▓рдВрдмреА рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╡рд┐рд╡рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдБ


рдХрдВрдкреНрдпреВрдЯрд░ рдореЗрдореЛрд░реА рдореЗрдВ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рджрд╢рдорд▓рд╡ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 123456789 рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

123456789 10 = 1 * 10 8 + 2 * 10 7 + 3 * 10 6 + 4 * 10 5 + 5 * 10 4 + 6 * 10 3 + 7 * 10 2 + 8 * 10 1 + 9 * 10 0

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдирд┐рдореНрди рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

A = a n-1- n-1 + a -2 2 n-2 + ... + 1 0 + 0 0
рдЬрд╣рд╛рдБ where рдЙрд╕ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЖрдзрд╛рд░ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЧреБрдгрд╛рдВрдХ i , рджреЛрд╣рд░реА рдЕрд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ 0 equ a i <baseред

рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдПрдХ рдмрд╣реБрдкрдж рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ x рдХреЗ рдмрдЬрд╛рдп рдЙрдкрдпреБрдХреНрдд рдбрд┐рдЧреНрд░реА рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рдбрд┐рдЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ is рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЬреНрдЮрд╛рдд рд╣реИ, рдмрд╣реБрдкрдж рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ 0 + 1 x 1 + 2 x 2 + ... + рдПрдХ n x n рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рдирдХреЗ рддрддреНрд╡ рдЧреБрдгрд╛рдВрдХ i рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕реВрдЪрдХрд╛рдВрдХ I рд╕рдВрдмрдВрдзрд┐рдд рдбрд┐рдЧреНрд░реА x рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рдЖрдзрд╛рд░ of рдХреА рдкрд╕рдВрдж рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рд╕рдВрдЦреНрдпрд╛ 123456789 рдХреЛ рджрд╕ рд╣рдЬрд╛рд░рд╡реЗрдВ (╬▓ = 10 4 ) рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

123456789 10 = 1 * (10 4 ) 2 + 2345 * (10 4 ) 1 + 6789 * (10 4 ) 0

рджрд╕-рд╣рдЬрд╝рд╛рд░ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 123456789 рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рджреЛ рд▓рд╛рдн рдорд┐рд▓рддреЗ рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрдкрднреЛрдЧ рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреА рдорд╛рддреНрд░рд╛ рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ 9 рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдмрдЬрд╛рдп рдпрд╣ 3 рд╕рдВрдЦреНрдпрд╛рдУрдВ (1, 2345 рдФрд░ 6789) рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдХрд╛рдлреАред рд╣рдо рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдорд╛рдирдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╕рдордп рдореЗрдВ рдХрд┐рд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ 4 рдЕрдВрдХреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдПрдХ-рдмрд┐рдЯ рдФрд░ 32-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЬрд▓реНрджреА рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЖрдзрд╛рд░ depends рдЖрдорддреМрд░ рдкрд░ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЖрдзрд╛рд░ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдирд┐рдореНрди рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ:

  1. рдЖрдзрд╛рд░ рдХреЛ рдореВрд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдлрд┐рдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП;
  2. рдЖрдзрд╛рд░ рдПрдХ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рди рдХреА рдЧрддрд┐ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рд╣реИ рдХрд┐ рдЧреБрдгрд╛рдВрдХ рд╡рд╛рд▓реЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рдмреБрдирд┐рдпрд╛рджреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ;
  3. рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдбреАрдмрдЧрд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдк, рдХреЛ 10 рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ, of - рджреЛ рдХреА рдПрдХ рд╢рдХреНрддрд┐ рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рддреЗрдЬреА рд╕реЗ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред

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

Microsoft рд╕реЗ BigInteger


рдпрджрд┐ рдЖрдк рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░ рдпрд╛ dotPeek рдбрд┐рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ BigInteger рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝реАрд▓реНрдб рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:

private static readonly BigInteger s_bnMinInt = new BigInteger(-1, new uint[1]{ (uint) int.MinValue }); private static readonly BigInteger s_bnOneInt = new BigInteger(1); private static readonly BigInteger s_bnZeroInt = new BigInteger(0); private static readonly BigInteger s_bnMinusOneInt = new BigInteger(-1); internal int _sign; internal uint[] _bits; private const int knMaskHighBit = -2147483648; private const uint kuMaskHighBit = 2147483648U; private const int kcbitUint = 32; private const int kcbitUlong = 64; private const int DecimalScaleFactorMask = 16711680; private const int DecimalSignMask = -2147483648; 

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЗрд╡рд▓ рджреЛ рдЙрджрд╛рд╣рд░рдг рдлрд╝реАрд▓реНрдб (_sign рдФрд░ _bits) рд╣реИрдВ, рд╢реЗрд╖ рдлрд╝реАрд▓реНрдб рд╕реНрдерд┐рд░рд╛рдВрдХ рдФрд░ рд╕реНрдерд┐рд░ рд░реАрдб рдлрд╝реАрд▓реНрдб рд╣реИрдВ рдЬреЛ рд╕рдВрдЦреНрдпрд╛ -1, 0 рдФрд░ 1 рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдорд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред

рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрд┐рд╣реНрди рдЪрд░ _sign рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ, рдФрд░ _bits рд╕рд░рдгреА рдореЗрдВ рдЧреБрдгрд╛рдВрдХ i рд╣реИ ред рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ _bits рд╕рд░рдгреА uint [] рдХреА рд╣реИ, рд╣рдо рдпрд╣ рднреА рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ╬▓ рдХрд╛ рдЖрдзрд╛рд░ рджреЛ 2 32 рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ uint рдПрдХ 32-рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рд╣реИ)ред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдпрд╛ рдЦрдВрдбрди рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред

рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛ рдПрдХ рдЗрдВрдЯ рд▓реЗрддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЗрдВрдЯреНрд░рд╕реНрдЯрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
 public BigInteger(int value) { if (value == int.MinValue) { this = BigInteger.s_bnMinInt; } else { this._sign = value; this._bits = (uint[]) null; } } 

рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди _sign рдЪрд░ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрджрд┐ рдПрдХ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЯ рд░реЗрдВрдЬ (-2 31 рд╕реЗ 2 31 -1 рддрдХ) рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ _sign рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ _bits рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╢реВрдиреНрдп рд╣реИред рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдмрд┐рдЧрдЗрдВрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рд╛рде рд╣реА рдЦрдкрдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрдбрд╝реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдЖрдЧреЗ рдмрдврд╝реЛред

рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдпреВрдВрдЯ рд▓реЗрддрд╛ рд╣реИ рд╡рд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрд╕реНрдЯ рдЙрдВрдЯ
 public BigInteger(uint value) { if (value <= (uint) int.MaxValue) { this._sign = (int) value; this._bits = (uint[]) null; } else { this._sign = 1; this._bits = new uint[1]; this._bits[0] = value; } } 

рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЯ рд░реЗрдВрдЬ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдпрд╛ рддреЛ _sign рдЪрд░ рдпрд╛ _bits рд╕рд░рдгреА рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рддрд╛, рдПрдХ 64-рдмрд┐рдЯ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ (рд▓рдВрдмреА) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдЬрдмрд╛рди рд▓рдВрдмреЗ
 public BigInteger(long value) { if ((long) int.MinValue <= value && value <= (long) int.MaxValue) { if (value == (long) int.MinValue) { this = BigInteger.s_bnMinInt; } else { this._sign = (int) value; this._bits = (uint[]) null; } } else { ulong num; if (value < 0L) { num = (ulong) -value; this._sign = -1; } else { num = (ulong) value; this._sign = 1; } this._bits = new uint[2]; this._bits[0] = (uint) num; this._bits[1] = (uint) (num >> 32); } } 

рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЯ рд░реЗрдВрдЬ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, _sign рдЪрд░ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрд┐рд╣реНрди рд╣реЛрддрд╛ рд╣реИ (рдирдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП -1 рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП 1), рдФрд░ _bit рд╕рд░рдгреА рдореЗрдВ рд╕рдорд╛рди рдЧреБрдгрд╛рдВрдХ i рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИред

 this._bits = new uint[2]; this._bits[0] = (uint) num; this._bits[1] = (uint) (num >> 32); 

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, 64-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЛ 32-рдмрд┐рдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: (uint) рд╕рдВрдЦреНрдпрд╛ рдФрд░ (uint) (рд╕рдВрдЦреНрдпрд╛ >> 32)ред рдкрд╣рд▓реА рд╕рдВрдЦреНрдпрд╛ рдкрд┐рдЫрд▓реЗ 32 рдмрд┐рдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдЬрдмрдХрд┐ рджреВрд╕рд░реА рдкрд╣рд▓реА 32 рдмрд┐рдЯреНрд╕ рд╣реИ (рдПрди рдмрд┐рдЯреНрд╕ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг 2 рдкреВрд░реНрдгрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдкреВрд░реНрдгрд╛рдВрдХ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ)ред

рдЖрдЗрдП рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рдЧ рд▓реЙрдиреНрдЧ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдореЗрдВ рдирдВрдмрд░ рд▓реЙрдиреНрдЧ.рдореИрдХреНрд╕рд╡реИрд▓реНрдпреВ = 2 63 -1 = 9223372036854775807 рдХреИрд╕реЗ рд╕реНрдЯреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ 2 32 рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ:


рдЕрд╕рд▓ рдореЗрдВ (uint) long.MaxValue = 4294967295, (uint) (long.MaxValue >> 32) = 2147483647ред

рддреЛ, 9223372036854775807 = 2147483647 * (2 32 ) 1 + 4294967295 * (2 32 ) 0 , рдФрд░ BigInteger
рдПрдХ рдЬреЛрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

_рд╕рд╛рдЗрди = 1
_bits = {4294967295, 2147483647} // рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕рдВрдЦреНрдпрд╛ рдкреАрдЫреЗ рдХреА рдУрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ

рдПрдХ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ -123456789101112131415151617181920 рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ:



рдЕрд░реНрдерд╛рддреН, рд╕рдВрдЦреНрдпрд╛ 2 32 рдХреА рд╢рдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реИ:
1234567891011121314151617181920 = 15 * (2 32 ) 3 + 2501550035 * (2 32 ) 2 + 3243814879 * (2 32 ) 1 + 4035623136 * (2 32 ) 0

рддреЛ BigInteger рдХреЛ рдПрдХ рдЬреЛрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

_sign = -1 // рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрд┐рд╣реНрди
_bit = {4035623136, 3243814879, 2501550035, 15}

рдПрдХ рд╕рдВрдЦреНрдпрд╛, рдЬреЛ рдПрдХ рдЕрдВрддрд░ рд╢реНрд░реЗрдгреА рдореЗрдВ рдлрд┐рдЯ рд╣реЛрддреА рд╣реИ, рдХрд╣рддреА рд╣реИ, 17 рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдЧреА:

_рд╕рд╛рдЗрди = 17
_рдмрд┐рдЯреНрд╕ = рдЕрд╢рдХреНрдд

BigInteger рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж , рд╣рдо рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:

  1. рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЕрдВрддрд░ рд╕реАрдорд╛ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЪрд░ _sign рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  2. рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ рдЗрдВрдЯ рд░реЗрдВрдЬ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЪрд┐рдиреНрд╣ рдЪрд░ _sign (рдирдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП -1 рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП 1) рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ _bits рд╕рд░рдгреА рдореЗрдВ рдЧреБрдгрд╛рдВрдХ 2 2 рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд╕рд╛рде рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд╛ рдПрдХ i рд╣реЛрддрд╛ рд╣реИред
рдЖрдзрд╛рд░ it = 2 32 рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдореНрди рд╕реНрддрд░ рдкрд░ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рджреЛ рдХреА рд╢рдХреНрддрд┐ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдФрд░ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ рдкрд╛рд░рд┐рдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ), рдФрд░ рд╕рдВрдЦреНрдпрд╛ рдХреЗ 32 рдЕрдВрдХреЛрдВ рдХреЛ рдПрдХ рд╕рдордп рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬреЛ рддреЗрдЬреА рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЙрди рдкрд░ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, BigInteger рд╕рдВрд░рдЪрдирд╛ .NET рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рд▓рдВрдмреА рдЕрдВрдХрдЧрдгрд┐рдд рдХрд╛ рдкреВрд░реНрдг-рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЙрд╕реА рд╕рдордп, Microsoft рдиреЗ рдЗрд╕реЗ рдЖрджрд┐рдо рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдХрд░реАрдм рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА: рдПрдХ BigInteger рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред BigInteger рдмреБрдирд┐рдпрд╛рджреА рдЧрдгрд┐рддреАрдп рд╕рдВрдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЬреЛрдбрд╝, рдШрдЯрд╛рд╡, рд╡рд┐рднрд╛рдЬрди, рдЧреБрдгрди, рдШрдЯрд╛рд╡, рдЛрдгрд╛рддреНрдордХ рдФрд░ рдПрдХрд╛рддреНрдордХ рдирдХрд╛рд░ рдЬреИрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпред рдЖрдк рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рджреЛ BigInteger рдорд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рддрд░рд╣, BigInteger рдмрд┐рдЯ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░, рдпрд╛, XOR, рдмрд╛рдПрдВ рд╢рд┐рдлреНрдЯ рдФрд░ рд░рд╛рдЗрдЯ рд╢рд┐рдлреНрдЯред

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдкрд░рд┐рднрд╛рд╖рд┐рдд рдСрдкрд░реЗрдЯрд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП, BigInteger рд╕рдВрд░рдЪрдирд╛ рдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрд╣ Add, Divide, Multiply, Negate, Subtract рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред Microsoft рдиреЗ рджрд╢рдорд▓рд╡ рдврд╛рдВрдЪреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдареАрдХ рд╡реИрд╕рд╛ рд╣реА рдХрд┐рдпрд╛ред

BigInteger рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдХрдИ рд╕рджрд╕реНрдп рд╕реАрдзреЗ рдЕрдиреНрдп рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рджрд╕реНрдпреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, BigInteger рдРрд╕реЗ рддрддреНрд╡ рдЬреЛрдбрд╝рддрд╛ рд╣реИ:


рдореЛрдиреЛ рдФрд░ рдЬрд╛рд╡рд╛ рдореЗрдВ BigInteger рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрдж


рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдореЛрдиреЛ рдХреЗ рдкрд╛рд╕ рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рднреА рд╕рдорд░реНрдерди рд╣реИред рдореЛрдиреЛ рдореЗрдВ BigInteger рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ Microsoft рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИред

рдпрд╣реА рд╣реИ, рдореЛрдиреЛ рдореЗрдВ рдирдВрдмрд░ 17 рдХреЛ рдПрдХ рдЬреЛрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛:

_sign = 1 // рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЪрд┐рдиреНрд╣
_рдмрд┐рдЯреНрд╕ = {17}

BigInteger рдХрд╛ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬрд╛рд╡рд╛ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 public class BigInteger extends Number implements Comparable<BigInteger> { int signum; int[] mag; private int bitCount = -1; private int bitLength = -1; private int lowestSetBit = -2; private int firstNonzeroByteNum = -2; private int firstNonzeroIntNum = -2; private final static long LONG_MASK = 0xffffffffL; } 

рдЪреВрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдЧреН рд╕рд░рдгреА рдЯрд╛рдЗрдк int [] рдХрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЬрд╛рд╡рд╛ рдФрд░ .NET рдореЗрдВ рдПрдХ рд▓рдВрдмреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЕрд▓рдЧ рд╣реЛрдЧрд╛ред .NET рдореЗрдВ, рдкреНрд░рд╕реНрддреБрддрд┐ рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛрдЧреА рдХреНрдпреЛрдВрдХрд┐ рдпреВрдВрдЯ рдкреНрд░рдХрд╛рд░ рдПрдХ рдмрдбрд╝реА рд╕реАрдорд╛ рддрдХ рдлреИрд▓рд╛ рд╣реИ:

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдЬрдмрд╛рди рд▓рдВрдмреЗ
 private BigInteger(long val) { if (val < 0) { signum = -1; val = -val; } else { signum = 1; } int highWord = (int)(val >>> 32); if (highWord == 0) { mag = new int[1]; mag[0] = (int)val; } else { mag = new int[2]; mag[0] = highWord; mag[1] = (int)val; } } 

рдЬрд╛рд╡рд╛ рдореЗрдВ, рд╕рд╛рде рд╣реА рдореЛрдиреЛ рдореЗрдВ, рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдП рдЧрдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИред

рдмрдбрд╝рд╛ рдкреНрд░рджрд░реНрд╢рди


рдЬрдм рдПрдХ рдмрдбрд╝реА BigInteger рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдСрдкрд░реЗрдЯрд░ ++ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИ:

 int length = 1000000; BigInteger num = BigInteger.Parse("12345678910111213141516171819"); for (int i = 2; i < length; i++) { if (IsPrime(i)) num++; } Console.WriteLine(num); 

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд┐рд╕реА рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╣реИред BigInteger рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рднрд╛рд╖рд╛ рд░рдирдЯрд╛рдЗрдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдирдпрд╛ BigInteger рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдорд╛рди рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рд╕рдВрдЪрд╛рд▓рди рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ BigInteger рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 int length = 1000000; BigInteger num = BigInteger.Parse("12345678910111213141516171819"); int temp = 0; for (int i = 2; i < length; i++) { if (IsPrime(i)) temp++; } num += temp; Console.WriteLine(num); 

рдЕрдиреНрдп .NET рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░ рднреА рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЪреВрдВрдХрд┐ BigInteger рдкреНрд░рдХрд╛рд░ рдХрд╛ рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓рд╛ рдмрд╛рдЙрдВрдб рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХрд╛ рдорд╛рди рдмрд╣реБрдд рдмрдбрд╝реЗ рдорд╛рдиреЛрдВ рддрдХ рдмрдврд╝ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдПрдХ рдФрд╕рдд рджрд░реНрдЬреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рд╕рд╛рд░рд╛рдВрд╢рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо, рдЬреЛ рд╕рдВрд╕реНрдХрд░рдг 4 рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдиреЗ рдкреВрд░реНрдгрд╛рдВрдХ рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЕрдзрд┐рдЧреНрд░рд╣рдг рдХрд┐рдпрд╛ рд╣реИред рд╢рд╛рдпрдж, рдкреВрд░реА рдЦреБрд╢реА рдХреЗ рд▓рд┐рдП, рдпрд╣ BigRational рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ .NET BCL рдореЗрдВ рдмреАрдЯрд╛ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореМрдЬреВрдж рд╣реИред

BigRational рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд┐рд╡рд░рдг: BigRational рд╕рдВрд░рдЪрдирд╛ BigInteger рдкреНрд░рдХрд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕реЗ .NET рдлреНрд░реЗрдорд╡рд░реНрдХ 4 рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЖрдкрдХреЛ рдордирдорд╛рдиреА рдкрд░рд┐рд╢реБрджреНрдзрддрд╛ рдХреЗ рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдкрд░рд┐рдореЗрдп рд╕рдВрдЦреНрдпрд╛ рджреЛ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХрд╛ рдЕрдиреБрдкрд╛рдд рд╣реИ, рдФрд░ BigRational рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, BigInteger рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓рд╛рднрд╛рдВрд╢ (рдЕрдВрд╢рджрд╛рддрд╛) рдФрд░ рднрд╛рдЬрдХ (рднрд╛рдЬрдХ) рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж: рдЧреМрд░рд╛рдВрдЧрд╛

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


All Articles