рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдХреЗрдВрджреНрд░реАрдп рд╡рд┐рд╖рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ
рд╣реИ , рд╡реЗ рд╣рд░ рдЬрдЧрд╣ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░, рд╣рд╛рд╣рд╛ рдореЗрдВ)ред
(рдХреНрдпрд╛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдмрдЯрди рд╕рдордЭреМрддреЗ рдХреЗ рдмрд┐рдирд╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?)рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рдореЗрдВ рд╕реЗ рдПрдХ рддрдерд╛рдХрдерд┐рдд
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИ - рджреЛ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ
рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЬрдХ (GCD) рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЖрдо рддрд░реАрдХрд╛ рд╣реИред рд╡рд╣ рдЕрдХреНрд╕рд░
рдЧрдгрд┐рдд рдФрд░
рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди (рдФрд░ рд╕реАрдЦрдирд╛) рд╢реБрд░реВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВред
рдФрд░
рдбреЛрдирд╛рд▓реНрдб рдиреЙрде , рдЧреНрд░рдВрде рдХреЗ рдХреБрдЦреНрдпрд╛рдд рд▓реЗрдЦрдХ "
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА
рдХрд▓рд╛ " (рдФрд░ рди рдХреЗрд╡рд▓), рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рдореЗрдВ рдкрд╣рд▓рд╛ (рдХрдо рд╕реЗ рдХрдо рдЖрдзреБрдирд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ) рдорд╛рдирддрд╛ рд╣реИред рдХреНрдпреЛрдВрдХрд┐, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
рдпреВрдХреНрд▓рд┐рдб , рдЬреЛ IV-III рд╢рддрд╛рдмреНрджрд┐рдпреЛрдВ рдореЗрдВ рд░рд╣рддреЗ рдереЗред рдИрд╕рд╛ рдкреВрд░реНрд╡ (рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдЕрд░рд╕реНрддреВ рджреНрд╡рд╛рд░рд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдПрдХ рд╕рджреА рдкрд╣рд▓реЗ рд░рд╣рддреЗ рдереЗ), рдпреВрдХреНрд▓рд┐рдб рдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛
рдкреБрдирд░рд╛рд╡реГрддреНрдд рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рд╢рдмреНрдж рдХреЗ рдЖрдзреБрдирд┐рдХ рдЕрд░реНрде рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред
"рдЕрд▓реНрдЧреЛрд░рд┐рдердо" рд╢рдмреНрдж рдлрд╛рд░рд╕реА рдЧрдгрд┐рддрдЬреНрдЮ
рдЕрд▓-рдЦреНрд╡рд╛рд░рд┐рдЬрд╝рдореА рдХреЗ рдирд╛рдо рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдард╡реАрдВ-рдиреМрд╡реАрдВ рд╢рддрд╛рдмреНрджреА рдХреЗ рдЖрд╕рдкрд╛рд╕ рд░рд╣рддрд╛ рдерд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдП.рдбреА. рдФрд░ рдЖрдзреБрдирд┐рдХ рдПрдХ рдХреЗ рдХрд░реАрдм рдПрдХ рдЕрд░реНрде рдореЗрдВ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рд╢реБрд░реБрдЖрдд рдХреЛ рдХреЗрд╡рд▓ 20 рд╡реАрдВ рд╢рддрд╛рдмреНрджреА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ - рдЗрд╕рдХреЗ рдкрд╣рд▓реЗ рджрд╢рдХ, рд╕реВрдЪрдирд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХрд╛ рдЙрджрдпред
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо
рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдирде рдХреЗ рд╕рдВрдкрд╛рджрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВред рдпрд╣ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХрдЯ рдХреЗ рдиреАрдЪреЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ:
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╡рд┐рд╡рд░рдг рдореВрд▓ рдХреЗ рдХрд░реАрдм рд╣реИрдкреНрд░рд╕реНрддрд╛рд╡ред рджрд┐рдП рдЧрдП рджреЛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рд╕рдмрд╕реЗ рдмрдбрд╝реЗ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЬрдХ рдХреЛ рдЦреЛрдЬреЗрдВред
A рдФрд░ C рдХреЛ рджреЛ рдкреВрд░реНрдгрд╛рдВрдХ рдкреВрд░реНрдгрд╛рдВрдХ рджрд┐рдП рдЧрдП рд╣реИрдВ; рдЙрдирдХреЗ GCD рдХреЛ рдЦреЛрдЬрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛ A C рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рд╣реИ, рддреЛ рд╕рдВрдЦреНрдпрд╛ C C рдФрд░ A рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рднрд╛рдЬрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рд╡рд┐рднрд╛рдЬрдХ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рд╕реА рд╕реЗ рдмрдбрд╝реА рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ C рдирдВрдмрд░ A рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рд▓рдЧрд╛рддрд╛рд░ рд╕рдВрдЦреНрдпрд╛ A рдФрд░ C рдХреЗ рдЫреЛрдЯреЗ рдХреЛ рдмрдбрд╝реЗ рд╕реЗ рдШрдЯрд╛рдПрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рд╣рдореЗрдВ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдШрдЯрд╛рдП рдЧрдП рднрд╛рдЧ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИред рдпрд╣ рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЕрдВрддрд░ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ рдпреВрдирд┐рдЯ рдкрд┐рдЫрд▓реЗ рдШрдЯрд╛рдП рдЧрдП рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдЧрд╛ред
рдЕрдм рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ E, C рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЦреНрдпрд╛ A рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╢реЗрд╖ рд╣реИ; F рдХреЛ E рд╕реЗ C рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╢реЗрд╖ рд╣реИ рдФрд░ F рдХреЛ E рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ F, E рдФрд░ E рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ C - F, F рдХреЛ рднреА C - F рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрд╡рдпрдВ рдХреЛ рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП F рдХреЛ C рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реА рдП - рдИ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рдПрдл рднреА рдП - рдИ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рдИ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕рд▓рд┐рдП, F, A рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, F, A рдФрд░ C рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рднрд╛рдЬрдХ рд╣реИред
рдЕрдм рдореИрдВ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдЬреАрд╕реАрдбреА рднреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ F, A рдФрд░ C рдХреА рд╕рдмрд╕реЗ рдмрдбрд╝реА рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЬрдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИ рдЬреЛ рдЗрди рджреЛрдиреЛрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдЧреАред рдРрд╕реЗ рдирдВрдмрд░ G рдХреЛ рджреЗрдВред
рдЪреВрдВрдХрд┐ рд╕рдВрдЦреНрдпрд╛ G рд╕рдВрдЦреНрдпрд╛ C рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рд╕рдВрдЦреНрдпрд╛ C A - E рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИ, G рднреА рд╕рдВрдЦреНрдпрд╛ A - E рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рд╕рдВрдЦреНрдпрд╛ G, рд╕рдВрдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛ A рдХреЛ рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╢реЗрд╖ E рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди E, E рдХреЛ C - F рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП G C рдХреЛ рднреА рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ - F. рдФрд░ рд╕рдВрдЦреНрдпрд╛ G рдХреЛ рднреА рдкреВрд░реНрдг рд╕рдВрдЦреНрдпрд╛ C рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╢реЗрд╖ F рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ; рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдПрдХ рдЫреЛрдЯреЗ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИ, рдФрд░ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдП рдФрд░ рд╕реА рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдл рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрдИ рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ рд╣реИ; рдЗрд╕рд▓рд┐рдП, рд╕рдВрдЦреНрдпрд╛ F GCD рд╣реИред
рдкрд░рд┐рдгрд╛рдоред рдпрд╣ рддрд░реНрдХ рдЗрд╕ рдзрд╛рд░рдгрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХреЛрдИ рднреА рд╕рдВрдЦреНрдпрд╛ рдЙрдирдХреЗ GCD рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреА рд╣реИред QED
рд╡рд┐рд╡рд░рдг рдЬреАрд╕реАрдбреА рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рджреЗрддрд╛ рд╣реИ - рдШрдЯрд╛рд╡ рдФрд░ рд╡рд┐рднрд╛рдЬрди рджреНрд╡рд╛рд░рд╛ред рджрд░рдЕрд╕рд▓, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдЗрди рджреЛ рддрд░реАрдХреЛрдВ рдХреЛ рдЖрдЬ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ
рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬреЛ рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ:
func subtractionGCD(_ firstNumber: Int, _ secondNumber: Int) -> Int { if let simpleGCD = simpleCasesGCD(firstNumber, secondNumber) { return simpleGCD } var firstNumber = firstNumber var secondNumber = secondNumber while firstNumber != 0, secondNumber != 0 { if firstNumber > secondNumber { firstNumber = firstNumber - secondNumber } else { secondNumber = secondNumber - firstNumber } } return firstNumber + secondNumber
рдпрд╣рд╛рдБ, рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреА рдЦрд╛рддрд┐рд░, рдореИрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд▓рд╛рдпрд╛, рдЬреАрд╕реАрдбреА рдХреА рдЦреЛрдЬ рдХреЗ рдорд╛рдорд▓реЗ, рдЬрдм рдпрд╣ рддреБрд░рдВрдд рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛:
func simpleCasesGCD(_ firstNumber: Int, _ secondNumber: Int) -> Int? { if firstNumber == secondNumber { return firstNumber
(рдпрджрд┐ рджреЛ рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдирдХрд╛ рдЬреАрд╕реАрдбреА рднреА рдЙрдирдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдпрджрд┐ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╢реВрдиреНрдп рд╣реИ, рддреЛ рдЬреАрд╕реАрдбреА рджреВрд╕рд░реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреА, рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рд╣реИ (рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╢реВрдиреНрдп рднреА) )ред
рдХреЗрд╡рд▓ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдирдХрд╛рд░рд╛рддреНрдордХ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕рдорд╛рди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред (рд╣рд╛рдВ, рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░рдХ рднреА рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬреАрд╕реАрдбреА рдХреЗ рд▓рд┐рдП рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╣рдореЗрд╢рд╛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред)
рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рд╡рд┐рднрд╛рдЬрди рджреНрд╡рд╛рд░рд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
func divisionGCD(_ firstNumber: Int, _ secondNumber: Int) -> Int { if let simpleGCD = simpleCasesGCD(firstNumber, secondNumber) { return simpleGCD } var firstNumber = firstNumber var secondNumber = secondNumber while firstNumber != 0, secondNumber != 0 { if firstNumber > secondNumber { firstNumber = firstNumber % secondNumber } else { secondNumber = secondNumber % firstNumber } } return firstNumber + secondNumber
рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЖрдЬ рдмреЗрд╣рддрд░ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдФрд╕рддрди, рдХрд╛рдлреА рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрджрдо рд╣реЛрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдРрд╕реЗ рд╕рдордп рдореЗрдВ рдЬрдм рдХрдВрдкреНрдпреВрдЯрд░ рдмрдбрд╝реЗ рдФрд░ рдзреАрдореЗ рдереЗ, рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдФрд░ рдлрд┐рд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рдЕрдзрд┐рдХ рдкреНрд░рднрд╛рд╡реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдорд╛рдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдорд╛рдк рдХрд┐рдП
measure(_:)
XCTest
Xcode XCTest
рдореЗрдВ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП "рджреЗрд╢реА" рдврд╛рдВрдЪреЗ
XCTestCase
рд╡рд░реНрдЧ рдХреА
XCTestCase
ред
рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреА рдПрдХ рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдорд╛рдк, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рд╕рд░рдгреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореИрдВрдиреЗ рдЬреЛрдбрд╝реЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ 9999 рддрдХ рд▓реЗ рд▓рд┐рдпрд╛ред рдорд╛рдк рдЧрдгрдирд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛рдУрдВ (рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЬреЛрдбрд╝реЗ) рдкрд░ рдХрд┐рдП рдЧрдП: рдПрдХ, рджрд╕, 100, 1000, 10000, 100000, 1,000,000 рдФрд░ 10,000,000ред рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдиреЗ рдореБрдЭреЗ рдХрдИ рдорд┐рдирдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рдХреА рдЙрдореНрдореАрдж рдХреА, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рдкрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд░реЛрдХрдирд╛ред
рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЗрдирдкреБрдЯ рдкреАрдврд╝реА рдХреЛрдб рд╣реИ:
let pairs = (0..<100).map { _ in (Int.random(in: 0..<10000), Int.random(in: 0..<10000)) }
рдорд╛рдк рд╕реНрд╡рдпрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:
func testSubstractionGCDPerformance() { measure() { _ = pairs.map { substractionGCD($0, $1) } } }
рдФрд░ рдпрд╣рд╛рдБ рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рд▓реЙрдиреНрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╣реИрдВ:
(рдШрдЯрд╛рд╡ - рдШрдЯрд╛рд╡, рд╡рд┐рднрд╛рдЬрди - рд╡рд┐рднрд╛рдЬрдиред)рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдзреБрдирд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдкрд░ рдШрдЯрд╛рд╡ рд╡рд┐рдзрд┐ рдХрд┐рддрдиреА рдЦреЛ рдЬрд╛рддреА рд╣реИред
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ "рдмреЗрд╣рддрд░" рд╕рдВрд╕реНрдХрд░рдг
рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ, рджреВрд╕рд░реЗ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рдХреЗ рд╢реЗрд╖ рдХреЗ рдмрдЬрд╛рдп, рдЗрд╕ рдСрдлрд╕реЗрдЯ рдФрд░ рджреВрд╕рд░реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рддрдм рдЬрдм рд╡рд┐рднрд╛рдЬрди рдХрд╛ рд╢реЗрд╖ рд╕рдВрдЦреНрдпрд╛ рджреВрд╕рд░реА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛред рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИ:
func improvedDivisionGCD(_ firstNumber: Int, _ secondNumber: Int) -> Int { if let simpleGCD = simpleCasesGCD(firstNumber, secondNumber) { return simpleGCD } var firstNumber = firstNumber var secondNumber = secondNumber while firstNumber != 0, secondNumber != 0 { if firstNumber > secondNumber { let firstNumberClaim = firstNumber % secondNumber if firstNumberClaim > secondNumber / 2 { firstNumber = abs(firstNumberClaim - secondNumber) } else { firstNumber = firstNumberClaim } } else { let secondNumberClaim = secondNumber % firstNumber if secondNumberClaim > firstNumber / 2 { secondNumber = abs(secondNumberClaim - firstNumber) } else { secondNumber = secondNumberClaim } } } return firstNumber + secondNumber
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрд╢реЛрдзрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдорд╛рдк рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧрдгрдирд╛ рдФрд░ рдЬрд╛рдВрдЪ рдЗрд╕ рд▓рд╛рдн рдХреЛ рдмреЗрдЕрд╕рд░ рдХрд░ рджреЗрдЧреА рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫ:
(рдмреЗрд╣рддрд░ "рдЙрдиреНрдирдд" рд╕рдВрд╕реНрдХрд░рдг рд╣реИред)рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдорд╣рддреНрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдПрдХ рдЬреНрдпрд╛рдорд┐рддреАрдп рд╕рдВрд╕реНрдХрд░рдг рднреА рд╣реИ (рджреЛ рдЦрдВрдбреЛрдВ рдХрд╛ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдорд╛рдк рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП)ред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЗрд╡рд▓ рджреЛ рд╣реА рдирд╣реАрдВ, рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЬреАрд╕реАрдбреА рдХреЛ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдерд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ: рдпрджрд┐ рд╣рдо рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ GCD (a, b) рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдирд╛рдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХрд╣рддреЗ рд╣реИрдВ, рддреАрди рдирдВрдмрд░ gcd (a, b, c) рдХрд╛ GCD, gcd (gcd (a, b), c) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рдФрд░ рдЗрд╕реА рддрд░рд╣, рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП GCD рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ GCD рдХреЗ GCD рдФрд░ рдЕрдЧрд▓реА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬреАрд╕реАрдбреА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдоред
GCD рдмрд╣реБрдкрдж рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рднреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕рд░рд▓ рдкреЛрд╕реНрдЯ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИ, рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ, рдЧрдгрд┐рдд рдХрд╛ рдореЗрд░рд╛ рдЬреНрдЮрд╛рдиред
рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬрдЯрд┐рд▓рддрд╛
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдЕрд╕реНрдерд╛рдпреА рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдЬрд╛рдВрдЪ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХреА рдЧрдИ рд╣реИ, рди рдХрд┐ рдЖрдкрдХреЗ рд╡рд┐рдирдореНрд░ рд╕реЗрд╡рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЬрд▓реНрджреА рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реАрдЦрд╛ рдкреБрд░реБрд╖реЛрдВ рджреНрд╡рд╛рд░рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╡рд╛рд▓ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдмрдВрдж рд╣реИ рдФрд░ рдПрдХ рдЬрд╡рд╛рдм рдорд┐рд▓ рдЧрдпрд╛ рд╣реИред рджрд░рдЕрд╕рд▓, рдкрд┐рдЫрд▓реА рд╕рджреА рд╕реЗ рдкрд╣рд▓реЗ рдмреАрдЪ рдореЗрдВ рд╡рд╛рдкрд╕ред
рдЧреЗрдмреНрд░рд┐рдпрд▓ рд▓рдВрдЧрдбрд╝рд╛ ред
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдЙрддреНрддрд░ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд▓реИрдо рдкреНрд░рдореЗрдп рджреНрд╡рд╛рд░рд╛ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рдХрдЯрддрдо рдмрдбрд╝реА
рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреА
, рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕рдмрд╕реЗ рдЫреЛрдЯреА рдорд╛рдЗрдирд╕ 2. рдереЛрдбрд╝реА рдЕрдзрд┐рдХ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЧрдгрд┐рддреАрдп рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдлрд┐рд░ рдЕрдЧрд░ u> v (рдФрд░ v> 1), рддреЛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рдкрд╛рд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ n - 2 рдХреЗ рд▓рд┐рдП рд╣реЛрдЧреАред v <Fn (Fn рдирд┐рдХрдЯрддрдо v рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдФрд░ n рдЗрд╕рдХреА рдЕрдиреБрдХреНрд░рдо рд╕рдВрдЦреНрдпрд╛ рд╣реИ)ред
рдХреНрд░рдорд╢рдГ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛ рддреЗрдЬреА рд╕реЗ рдмрдврд╝рддреА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рдХрд╛ рдПрдХ рд▓рдШреБрдЧрдгрдХ рдХрд╛рд░реНрдп рд╣реИ (рджреЛ рдЗрдирдкреБрдЯ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдЫреЛрдЯрд╛)ред
рдЗрд╕реА рдЧрдгрдирд╛ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд▓рдЧрд╛рддрд╛рд░ рджреЛ рдлрд╛рдЗрдмреЛрдиреИрдЪрд┐ рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реИрдВред
рдПрдирдУрдбреА рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡рд┐рдзрд┐
рдЬреАрд╕реАрдбреА рдХреА рдЦреЛрдЬ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдкрд┐рдЫрд▓реА рд╢рддрд╛рдмреНрджреА рдХреЗ 60 рдХреЗ рджрд╢рдХ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЬреЛрд╕реЗрдл рд╕реНрдЯреАрди рдиреЗ рдХрд╣рд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рд╡реЗрдм рдкрд░ рдХреЛрдИ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рдорд┐рд▓реАред рдпрд╣ (рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо)
рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рдЙрдиреНрдореБрдЦ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдСрдкрд░реЗрд╢рди рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗрд╡рд▓ рд╕рдорддрд╛ рдХреА рдЬрд╛рдБрдЪ рдФрд░ рд░реБрдХрдиреЗ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдЕрдХреЗрд▓реЗ рдмрд╛рдЗрдирд░реА рдЕрдВрдХрдЧрдгрд┐рддреАрдп рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реИред
рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЪрд╛рд░ рддрдереНрдпреЛрдВ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ:
- рдпрджрд┐ u рдФрд░ v рджреЛрдиреЛрдВ рд╕рдорд╛рди рд╣реИрдВ, рддреЛ gcd (u, v) = 2 * gcd (u / 2, v / 2);
- рдпрджрд┐ u рд╕рдо рд╣реИ рдФрд░ v рдирд╣реАрдВ рд╣реИ, рддреЛ gcd (u, v) = gcd (u / 2, v);
- gcd (u, v) = gcd (u - v, v) (рдпрд╣ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ);
- рдпрджрд┐ u рдФрд░ v рджреЛрдиреЛрдВ рд╡рд┐рд╖рдо рд╣реИрдВ, рддреЛ u - v рд╕рдо рд╣реИ рдФрд░ | u - v | <рдЕрдзрд┐рдХрддрдо (u, v)
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЖрдк рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдзреБрдирд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ), рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕реНрд╡рд┐рдлреНрдЯ рдкрд░ рдлрд┐рд░ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ред рдФрд░ рдпрд╣рд╛рдБ рдореИрдВ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрддрд╛ рд╣реВрдБ:
func binaryGCD(_ firstNumber: Int, _ secondNumber: Int) -> Int { if let simpleGCD = simpleCasesGCD(firstNumber, secondNumber) { return simpleGCD } var firstNumber = firstNumber var secondNumber = secondNumber var shift = 0 while (firstNumber | secondNumber) & 1 == 0 { shift += 1 firstNumber >>= 1 secondNumber >>= 1 } while firstNumber & 1 == 0 { firstNumber >>= 1 } repeat { while secondNumber & 1 == 0 { secondNumber >>= 1 } if firstNumber > secondNumber { swap(&firstNumber, &secondNumber) } secondNumber -= firstNumber } while secondNumber != 0 return firstNumber << shift }
рдЙрд╕реА рдбреЗрдЯрд╛ рдкрд░ рдорд╛рдк рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд░реЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдпрд╣ рдкрд░рд┐рд╖реНрдХреГрдд рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЙрд╕ рдкрд░ рд░рдЦреА рдЧрдИ рдЙрдореНрдореАрджреЛрдВ рдкрд░ рдЦрд░рд╛ рдирд╣реАрдВ рдЙрддрд░рд╛ред рдмреЗрд╢рдХ, рдпрд╣ рдЕрдм рднреА рджреЛ рдмрд╛рд░ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЗ рд░реВрдк рдореЗрдВ рдШрдЯрд╛рд╡ рджреНрд╡рд╛рд░рд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдХрдо рд╣реИред рдкреВрд░реНрдг рд╕рд╛рд░рд╛рдВрд╢ рддрд╛рд▓рд┐рдХрд╛:
(рдмрд╛рдЗрдирд░реА рдПрдХ рдмрд╛рдЗрдирд░реА рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИред)(рдореИрдВ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпрд╛ рд╣реИ?
рд╡реИрд╕реЗ, рдпрд╣ рдПрд▓реНрдЧреЛрд░рд┐рджрдо, рдЬрд┐рд╕рдиреЗ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рд╕реВрдЪрдирд╛ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдХреЗ рдпреБрдЧ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 15 рдорд┐рдирдЯ рдХреА рдкреНрд░рд╕рд┐рджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХреА (рд╡рд░реНрддрдорд╛рди рдПрдХ рд╕реЗ рдкрд╣рд▓реЗ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ), рдкреНрд░рд╛рдЪреАрди рдЪреАрди рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рдерд╛ред рдЙрдирдХрд╛ рд╡рд░реНрдгрди рдкрд╣рд▓реА рд╢рддрд╛рдмреНрджреА рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдИрд╕рд╛ рдкреВрд░реНрд╡ рдмреЗрд╢рдХ, "рдЖрдзрд╛ рд╡рд┐рднрд╛рдЬрди" рдФрд░ рдШрдЯрд╛рд╡ рдЬреИрд╕реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВред рдФрд░ рднрд┐рдиреНрдиреЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреАред
рдирд┐рд╖реНрдХрд░реНрд╖
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдЗрд╕ рд╕рд░рд▓ "рд╢реЛрдз" рдХреЗ рд╕рд╛рде рдореИрдВ рдХреБрдЫ рднреА рд╕рд╛рдмрд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рдерд╛ рдФрд░ рдХреЛрдИ рдХреНрд░рд╛рдВрддрд┐рдХрд╛рд░реА рдирд┐рд╖реНрдХрд░реНрд╖ рдирд╣реАрдВ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдФрд░ рдореИрдВрдиреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛!)ред рдореИрдВ рд╕рд┐рд░реНрдл рдЕрдкрдиреА рдЬрд┐рдЬреНрдЮрд╛рд╕рд╛ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рд╢рд╛рд╕реНрддреНрд░реАрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдХрд╛рдо рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрдврд╝рд╛рддрд╛ рд╣реВрдВред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрд╕реБрдХ рдереЗ!