
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА
рд╕рд┐рдВрдЧрд▓-рд▓рд╛рдЗрди рдЗрди рд╕реА ++ рдкрд░ рдПрдХ рд▓реЗрдЦ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдХреБрдЫ рдФрд░ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╕рд╛рде рд╣реА рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рдХрдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХреЗ рд╕рд╛рде)ред
рд╕рднреА рдЗрдЪреНрдЫреБрдХ рдХреГрдкрдпрд╛ рдХрдЯреМрддреА рдХреЗ рд▓рд┐рдП рдкреВрдЫреЗрдВ;)
1. рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг
рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
prime(100, int(sqrt(100)));
рд▓рд┐рдЦреЗрдВ
prime(100, int(sqrt(100)));
bool prime(int n, int div) { return ( div == 1) ? true : (n % div != 0) && (prime(n, div-1)); }
рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЖрд╡рд░рдг рд╕рдорд╛рд░реЛрд╣ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:
bool prime(int n) { return ( n == 1 )? 0 : ( prime( n, int(sqrt(n))) ) ; }
рдФрд░ рдЕрдм, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
prime(100)
рд▓рд┐рдЦреЗрдВ
prime(100)
2. рдЧреНрд░реЗ рдХреЛрдб
рдПрдХ рдЧреНрд░реЗ рдХреЛрдб рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрдм рджреЛ рдкрдбрд╝реЛрд╕реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдХреЛрдб рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдмрд┐рдЯ рдореЗрдВ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред
int codeGrey (int n) { return n ^ (n >> 1); }
рд╕рд╛рде рд╣реА рдЧреНрд░реЗ рдХрд╛ рд░рд┐рд╡рд░реНрд╕ рдХреЛрдб рдвреВрдВрдв рд░рд╣рд╛ рд╣реИ
int revCodeGrey (int g) { int n; for (n=0; g; n ^=g, g>>=1); return n; }
рд╡рд┐рднрд┐рдиреНрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЧреНрд░реЗ рдХреЛрдб рдХреЗ рдХрдИ рдЙрдкрдпреЛрдЧ рд╣реИрдВ:
- рдЧреНрд░реЗ рдмрд┐рдЯ рдХреЛрдб рдПрдХ рдПрди-рдбрд╛рдпрдореЗрдВрд╢рдирд▓ рдХреНрдпреВрдм рдореЗрдВ рд╣реИрдорд┐рд▓реНрдЯрдирд┐рдпрди рдЪрдХреНрд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ
- рд╣рдиреЛрдИ рдЯрд╛рд╡рд░реЛрдВ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ
- рдЖрдиреБрд╡рдВрд╢рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЖрд╡реЗрджрди
3. рджреНрд╡рд┐рдкрдж рдЧреБрдгрд╛рдВрдХ рдХреА рдЧрдгрдирд╛
рджреНрд╡рд┐рдкрдж рдЧреБрдгрд╛рдВрдХ рдиреНрдпреВрдЯрди рдХреЗ рджреНрд╡рд┐рдкрдж рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдЧреБрдгрд╛рдВрдХ рд╣реИ

рдПрдХреНрд╕ рдХреА рд╢рдХреНрддрд┐рдпреЛрдВ рдореЗрдВред
int binomialCoefficient(int k, int n) { return (n==k || k==0)?1:binomialCoefficient(k-1,n-1)+binomialCoefficient(k,n-1); }
4. рднрд╛рдЬреНрдп рднрд╛рдЬрдХ рдХреА рдбрд┐рдЧреНрд░реА рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛
рджреЛ рдирдВрдмрд░ рджрд┐рдП рдЧрдП рд╣реИрдВ: [n] рдФрд░ [k]ред рдпрд╣ рдЙрд╕ рдбрд┐рдЧреНрд░реА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬрд┐рд╕ рдкрд░ рднрд╛рдЬрдХ [рдХреЗ] рдХреЛ рд╕рдВрдЦреНрдпрд╛ [рдПрди] рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
int factPow(int n, int k) { return (n)? (n/k + factPow(n/k, k)):0; }
5. рд╕рдВрдЦреНрдпрд╛ [a] рдХреЛ рд╢рдХреНрддрд┐ [b] рдореЛрдбреБрд▓реЛ [p] рдХреЛ рдКрдкрд░ рдЙрдард╛рдирд╛ред
nt powM(int a, int b, int p) { return b ? (a * powM(a-1, b, p) % p) : 1; }
рдЖрдк рдпрд╣рд╛рдВ рднрд╛рд░рддреАрдп рдкреНрд░рддрд┐рдкрд╛рджрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
int powM(int a, int b, int p) { return b ? ((b&1?a:1)*powM(a*a, b/2, p) % p) : 1; }
рд╕реНрд╡рдкрд╛ рдХрд╛ рдореЗрд░рд╛ рдЕрдзреНрдпрдпрди
рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ SWAPs рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдорд┐рд▓рд╛, рдЬреЛ рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реИред
SWAP рдЯреЗрд╕реНрдЯ рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реЛрдЧрд╛
int a=1, b=2; for(int i=0; i<=300000000; i++) { swap(&a, &b); }
рдЬрд╣рд╛рдВ рд╕реНрд╡реИрдк рдХреЗ рдмрдЬрд╛рдп, рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реЛрдВрдЧреЗред
SWAP0
рддреЛ рдЪрд▓реЛ STLivsky рдорд╛рдирдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:
template <class T> void swap0 ( T& a, T& b ) { T c(a); a=b; b=c; }
рдЙрдирдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
1,996 sec. 1,986 sec. 1,996 sec.
SWAP1
рдЕрдЧрд▓рд╛ SWAP рддрдерд╛рдХрдерд┐рдд XOR SWAP рд╣реЛрдЧрд╛:
void swap1(int *a, int *b) { *a ^= ( *b ^= ( *a ^= *b )); }
рдЙрдирдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
3,603 sec. 3,603 sec. 3,608 sec.
SWAP2
void swap2(int *a, int *b) { *a += *b -= *a = *b - *a; }
рдЙрд╕рдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
3.728 sec. 3.723 sec. 3.728 sec.
SWAP3
void swap3(int *a, int *b) { *a /= *b = (*a= *a * (*b)) / (*b); }
рдЙрд╕рдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
7.878 sec. 7.862 sec. 7.862 sec.
SWAP4
void swap4(int *a, int *b) { *b= *a + *b - (*a = *b); }
рдЙрд╕рдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
2.012 sec. 2.007 sec. 2.012 sec.
SWAP5
void swap5(int *a, int *b) { *a=(*b=(*a=*b^*a)^*b)^*a; }
рдЙрд╕рдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
3.198 sec. 3.213 sec. 3.198 sec.
SWAP6
рдЦреИрд░, рдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ GCC рд╕рдВрдХрд▓рдХ рдХреЗ рд▓рд┐рдП рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░реЗрдВ
void swap7(int *a, int *b) { asm volatile( "XOR %%EAX, %%EBX; \n\t" "XOR %%EBX, %%EAX; \n\t" "XOR %%EAX, %%EBX; \n\t" :"=a"(*a),"=b"(*b) :"a"(*a),"b"(*b) ); }
рдЙрд╕рдХреЗ рд╕рдВрдХреЗрддрдХ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдереЗ:
2.199 sec. 2.153 sec. 2.167 sec.
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА рд╢реЛрдз рддрд╛рд▓рд┐рдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
SWAP0 - 1.992 sec.
SWAP4 - 2.010 sec.
SWAP6 - 2.173 sec.
SWAP5 - 3.203 sec.
SWAP1 - 3.604 sec.
SWAP2 - 3.726 sec.
SWAP3 - 7.867 sec.