ããã«ã¡ã¯HabrïŒ a
5 + b
5 + c
5 + d
5 = e
5ã®åœ¢ã®ãã£ãªãã¡ã³ãã¹æ¹çšåŒã解ãããã®ããã°ã©ã ã®ããã€ãã®æ¹è¯çãæžãããšã«ããããªã€ã©ãŒä»®èª¬
ã«é¢ãã äžé£ã® èšäºãç¶ããããšã«ããŸããã
ãåç¥ã®ããã«ãè€éãªèšç®äžã®åé¡ã解決ããã«ã¯ãå°ãªããšã次ã®ç¹ã«æ³šæããå¿
èŠããããŸãã
- å¹ççãªã¢ã«ãŽãªãºã
- è¿
éãªå®è£
- 匷åãªé
- 䞊åå
æåã®ç¹ã«æã泚æãæããŸããã ãã®çµæãèŠãŠã¿ãŸãããã
ããã«ãã³ãŒããC ++ã§èšè¿°ããã32ãããMS Visual C ++ 2008ã³ã³ãã€ã©ãã³ã³ãã€ã«ãããi5-2410M 2.3Ghzãã·ã³ã®ã·ã³ã°ã«ã¹ã¬ããã§èµ·åãããããšã«æ³šç®ããŸãã ããã»ã©åŒ·åã§ã¯ãªãã©ãããããã«æšªããã£ãŠããéã«ã³ãŒããæžãæ¹ã䟿å©ã§ã64ãããã³ã³ãã€ã©ãé¢åã ãšããã ãã§ãã ãã©ãŠã¶ãŒãªã©ã®ä»ã®ããã»ã¹ãåäœæéã«ãããã«åœ±é¿ãäžããå¯èœæ§ãããäžæ¹ã§ãã³ãŒãã枬å®ã®ããã«1å以äžå®è¡ãããããšã¯ãã£ãã«ãªããããæé枬å®ã¯æ£ç¢ºã«èŒããŸããã ãã ããç§ãã¡ã®ç®çã§ã¯ã粟床ã¯èš±å®¹ç¯å²ã§ãã
ããã§ãã
Dimchanskyã®æåºã«ãããaãbãcãdãe> 0ã®äžèšã®æ¹çšåŒã®æŽæ°è§£ãæ¢ãããšãæ確ã«ããŸãã 3çªç®ã®è§£æ±ºçããããŸãããå€æ°ã¯è² ã®å€ãåãããšãã§ããŸãã ãããã¯ãã¹ãŠ
ããã«ãããŸã ã
Oã®ç©èªïŒ1ïŒn 5 ïŒ
å¯èœãªéãæããªè§£æ±ºçããå§ããŸãããã ã³ãŒãïŒ
ã³ãŒãlong long gcd( long long x, long long y ) { while (x&&y) x>y ? x%=y : y%=x; return x+y; } void tale1( int n ) { for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) for (int c=b+1; c<=n; c++) for (int d=c+1; d<=n; d++) for (int e=d+1; e<=n; e++) { long long a5 = (long long)a*a*a*a*a; long long b5 = (long long)b*b*b*b*b; long long c5 = (long long)c*c*c*c*c; long long d5 = (long long)d*d*d*d*d; long long e5 = (long long)e*e*e*e*e; if (a5 + b5 + c5 + d5 == e5) if (gcd( a, gcd( gcd( b, c ), gcd( d, e ) ) ) == 1) printf( "%d^5 + %d^5 + %d^5 + %d^5 = %d^5\n", a, b, c, d, e ); } }
å®éãããã¯æãæããªãã®ã§ã¯ãããŸããã1ããnãŸã§ã®ãã¹ãŠã®å€æ°ãæäœããæåŸã«a <b <c <d <eã§ããããšã確èªã§ããããã§ãã ããããããããç§ã¯ããŸãã«ãé·ãåŸ
ããªããã°ãªããŸããã äœæ¥æéïŒ
n | æé |
---|
100 | 1563ms |
200 | 40代 |
500 | 74m |
é·æïŒãã§ã«ãããŒãã®ããã«ã·ã³ãã«ã§ãããã«èšè¿°ã§ããOïŒ1ïŒã¡ã¢ãªãå¿
èŠã§ãããå€å
žçãªè§£27
5 + 84
5 + 110
5 + 133
5 = 144
5ãèŠã€ããŸãã
çæïŒ çŠæ¢ãããŠããŸãã
Oã®ç©èªïŒ2ïŒn 4 log nïŒ
ãœãªã¥ãŒã·ã§ã³ãå°ãã¹ããŒãã¢ããããŸãããã å®éããã®ãªãã·ã§ã³ã¯åå¿
drBasicã«ãã£ãŠææ¡ããããã®ãšåç
ã§ã ã
ã³ãŒã void tale2( int n ) { vector< pair< long long, int > > vec; for (int a=1; a<=n; a++) vec.push_back( make_pair( (long long)a*a*a*a*a, a ) ); for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) for (int c=b+1; c<=n; c++) for (int d=c+1; d<=n; d++) { long long a5 = (long long)a*a*a*a*a; long long b5 = (long long)b*b*b*b*b; long long c5 = (long long)c*c*c*c*c; long long d5 = (long long)d*d*d*d*d; long long sum = a5+b5+c5+d5; vector< pair< long long, int > >::iterator it = lower_bound( vec.begin(), vec.end(), make_pair( sum, 0 ) ); if (it != vec.end() && it->first==sum) if (gcd( a, gcd( gcd( b, c ), gcd( d, it->second ) ) ) == 1) printf( "%d^5 + %d^5 + %d^5 + %d^5 = %d^5\n", a, b, c, d, it->second ); } }
ããã§é
åãäœæãã1ããnãŸã§ã®ãã¹ãŠã®æ°å€ã®5ä¹ãæ ŒçŽããŸãã次ã«ããã€ããªæ€çŽ¢ã§4ã€ã®ãã¹ããããã«ãŒãå
ã§ãæ°å€a
5 + b
5 + c
5 + d
5ãé
åã«ãããã©ããã確èªããŸãã
n | æéïŒ1 | æéïŒ2 |
---|
100 | 1563ms | 318ms |
200 | 40代 | 4140ms |
500 | 74m | 189 |
1000 | | 55m |
ãã®ãªãã·ã§ã³ã¯ãã§ã«é«éã§å®è¡ãããŠãããããã°ã©ã ãn = 1000ã§åäœãçµããã®ãåŸ
ã€å¿èãããããŸããã
é·æïŒãŸã éåžžã«ã·ã³ãã«ã§ãæããªãœãªã¥ãŒã·ã§ã³ãããéããæžãã®ãç°¡åã§ãå€å
žçãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããŸãã
çæïŒ OïŒnïŒã¡ã¢ãªãå¿
èŠ
ã§ããããŸã
æå¶ãããŠããŸãã
OïŒn 4 log nïŒã®ç©èªïŒ3ããã ãOïŒ1ïŒã¡ã¢ãª
å®éããã¹ãŠã®åŠäœãé
åã«ä¿åããããã§ãã³ãæ€çŽ¢ã§äœããæ¢ãã®ã¯æå³ããããŸããã ãã®é
åã®äœçœ®iã®çªå·ã¯ãã§ã«ããã£ãŠããŸãã ãä»®æ³ãã¢ã¬ã€ã§åçŽã«ãã³æ€çŽ¢ãå®è¡ã§ããŸãã ããã«èšã£ãŠãã£ãïŒ
ã³ãŒã void tale3( int n ) { for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) for (int c=b+1; c<=n; c++) for (int d=c+1; d<=n; d++) { long long a5 = (long long)a*a*a*a*a; long long b5 = (long long)b*b*b*b*b; long long c5 = (long long)c*c*c*c*c; long long d5 = (long long)d*d*d*d*d; long long sum = a5+b5+c5+d5; if (sum <= (long long)n*n*n*n*n) { int mi = d, ma = n;
ããã§é
åã¯äžèŠã«ãªããçŽç²ãªãã€ããªæ€çŽ¢ãã§ããŸããã
n | æéïŒ1 | æéïŒ2 | æéïŒ3 |
---|
100 | 1563ms | 318ms | 490ms |
200 | 40代 | 4140ms | 6728ms |
500 | 74m | 189 | 352ç§ |
1000 | | 55m | |
æ®å¿µãªããããããããã³æ€çŽ¢å
ã§æ¯å5ä¹ãåèšç®ãããããã©ã³ã¿ã€ã ã¯äœäžããŸããã ããã§ããã
é·æïŒ OïŒ1ïŒã¡ã¢ãªãå¿
èŠã§ãå€å
žçãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããŸãã
çæïŒä»¥åã®ãœãªã¥ãŒã·ã§ã³ãããé
ãã
Oã®ç©èªïŒ4ïŒn 4 ïŒ
æ¹çšåŒãããäžåºŠèŠãŠã¿ãŸãããã
a
5 + b
5 + c
5 + d
5 = e
5ãŸãã¯ãç°¡åã«ããããã«ãA =Bã
ã¢ã«ãŽãªãºã ã«4ã€ã®ãã¹ããããã«ãŒããå®è¡ãããŸãã å€aãbãããã³cãä¿®æ£ããdããã³eã®å€ã®åäœã確èªããŸãã ããã€ãã®d = xã«ã€ããŠãA <= Bãyãšçããeã®æå°å€ãšããŸãã d = xã®å Žåãå€e> yãèæ
®ããããšã¯æå³ããããŸããã ãŸããd = x + 1ã®å ŽåãA <= Bã§ããeã®æå°å€ã¯y以äžã§ãã ã€ãŸããdã«æ²¿ã£ãŠeã®å€ããã€ã§ãç©ããã«å¢ããããšãã§ããããã«ããäœãèŠéãããšããªããªããŸãã dãšeã®å€ã¯å¢å ããã ããªã®ã§ããããã«æ²¿ã£ãäžè¬çãªçµéã«ã¯OïŒnïŒæéããããŸãã ãã®èãæ¹ã¯ã2ãã€ã³ã¿ãŒã¡ãœãããšåŒã°ããŸãã
ã³ãŒã void tale4( int n ) { for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) for (int c=b+1; c<=n; c++) { int e = c+1; for (int d=c+1; d<=n; d++) { long long a5 = (long long)a*a*a*a*a; long long b5 = (long long)b*b*b*b*b; long long c5 = (long long)c*c*c*c*c; long long d5 = (long long)d*d*d*d*d; long long sum = a5+b5+c5+d5; while (e<n && (long long)e*e*e*e*e < sum) e++; if (sum == (long long)e*e*e*e*e) if (gcd( a, gcd( gcd( b, c ), gcd( d, e ) ) ) == 1) printf( "%d^5 + %d^5 + %d^5 + %d^5 = %d^5\n", a, b, c, d, e ); } } }
ã³ãŒãã¯ãã³æ€çŽ¢ã®å Žåãããå°ãªããããå€ãã®å©ç¹ããããŸãã
n | æéïŒ1 | æéïŒ2 | æéïŒ3 | æéïŒ4 |
---|
100 | 1563ms | 318ms | 490ms | 360ms |
200 | 40代 | 4140ms | 6728ms | 4339ms |
500 | 74m | 189 | 352ç§ | 177 |
1000 | | 55m | | 46m |
é ãããå®æ°ã倧ããããããã®ãœãªã¥ãŒã·ã§ã³ã¯ããœãªã¥ãŒã·ã§ã³çªå·2ãOïŒn
4 log nïŒã§500ã®ãªãŒããŒã§ã®ã¿è¿œãè¶ãå§ããŸãããã¡ããã5çªç®ã®çŽ¯ä¹ãããæ
éã«èšç®ããããšã§å éã§ããŸããããããè¡ããŸããã
é·æïŒãœãªã¥ãŒã·ã§ã³ïŒ2ããã挞è¿çã«é«éã§ãããããOïŒ1ïŒã¡ã¢ãªãå¿
èŠã§ãã ã¯ããããã§ãã
çæïŒæé©ãšã¯ã»ã©é ãã倧ããªé ããå®æ°ã
Oã®ç©èªïŒ5ïŒn 3 ïŒ
2ã€ã®ãã€ã³ã¿ãŒã䜿çšããŠã¢ã€ãã¢ãéçºãããœãªã¥ãŒã·ã§ã³ã®æ®ãã®éšåãéããŸã«ããŸãããã æ¹çšåŒA + B = CããããAãBãCã®ããããã«ã€ããŠãããããéžæããnïŒAïŒãnïŒBïŒãnïŒCïŒã®æ¹æ³ããããšããŸãã Cã®å€ãä¿®æ£ããAãšBã®ãã¹ãŠã®æå¹ãªå€ãæé ã§ãœãŒãããŸãããã 次ã«ã2ã€ã®ãã€ã³ã¿ãŒã䜿çšããŠAãšBã®å€ã«æ²¿ã£ãŠå®è¡ããOïŒnïŒAïŒ+ nïŒBïŒïŒã«ã€ããŠãCã®çŸåšã®å€ã«å¿
èŠãªãã¹ãŠããã§ãã¯ããŸãïŒ ã€ãŸããããã€ãã®åºå®Aã«ã€ããŠã¯ãBã®å€ãæžãããŸãããA + B> Cã§ãã A + B <= Cã«ãªããšããã«ãBãããã«æžããæå³ã¯ãããŸããã 次ã«ãAãå¢ãããBãæžããããã»ã¹ãç¶ããŸããã¢ã«ãŽãªãºã å
šäœã¯OïŒnïŒAïŒlog nïŒAïŒ+ nïŒBïŒlog nïŒBïŒ+ïŒnïŒAïŒ+ nïŒBïŒïŒnïŒ CïŒïŒã
AãšBãåãã»ããã®èŠçŽ ã§ããå ŽåãçŸåšã®AãšBãäžèŽãããšããã«ãåºå®Cããã§ãã¯ããã¢ã«ãŽãªãºã ãåæ¢ã§ããŸãïŒäžè¬æ§ã倱ãããšãªããA <Bãšä»®å®ã§ããããïŒã
ããã§ãæ¹çšåŒã§ã¯ãAã«å¯ŸããŠïŒa
5 + b
5 ïŒãBã«å¯ŸããŠïŒc
5 + d
5 ïŒãCã«å¯ŸããŠe
5ã瀺ããŸãããããŠã次ã®ã³ãŒããèšè¿°ããŸãã
ã³ãŒã void tale5( int n ) { vector< pair< long long, int > > vec; for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) { long long a5 = (long long)a*a*a*a*a; long long b5 = (long long)b*b*b*b*b; if (a5 + b5 < (long long)n*n*n*n*n)
ãã¢ïŒaãbïŒïŒããã³ïŒcãdïŒïŒã®é åºã¯n
2ã§ããããããœãŒãã«ã¯OïŒn
2 log nïŒãå¿
èŠã«ãªãããã€ã³ã¿ãŒã䜿çšãã以éã®ãã§ãã¯ã¯OïŒn
3 ïŒã«ãªããŸãã ç·ããããã¥ãŒãã
ãšã¯ãµãµã€ãº ã äžèšã®ã³ãŒãã§è«çãšã©ãŒãèŠã€ããŸãã
çããèŠãåã«æ°åèããŠãã ãããç§ãã¡ã®å ŽåããœãŒããããé
åã§ã¯ãçè«çã«ã¯åãåèšãèœã¡ã2ã€ã®ãã€ã³ã¿ãŒãããã€ãã®çåŒãã¹ãããããå¯èœæ§ããããŸãã ããããå®éã«ã¯ããããã¯ãã¹ãŠæ¬¡ã®æšè«ãšã¯ç°ãªããŸãïŒå¶ç¶ã®äžèŽãããå Žåãxãyãzãtã«ã€ããŠx ^ 5 + y ^ 5 = z ^ 5 + t ^ 5ã§ããã
ãã®ä»®èª¬ã«å¯ŸããåäŸãèŠã€ããŸããã ä¿®æ£ãšããŠãããªããã§ããæãç°¡åãªããšã¯ããã¹ãŠã®æ°å€ãæ¬åœã«ç°ãªãããšã確èªããããšã§ãã
n | ïŒ1 | ïŒ2 | ïŒ3 | ïŒ4 | ïŒ5 |
---|
100 | 1563ms | 318ms | 490ms | 360ms | 82ms |
200 | 40代 | 4140ms | 6728ms | 4339ms | 121ms |
500 | 74m | 189 | 352ç§ | 177 | 516ms |
1000 | | 55m | | 46m | 3119ms |
2000幎 | | | | | 22ç§ |
5000 | | | | | 328 |
倧å¹
ãªå éã«ããã蚱容å¯èœãªæéå
ã§n = 5000ããã©ãã°ã§ããŸãã ãªãŒããŒãããŒãåé¿ããããã«ãé
åã«ãã¢ãè¿œå ãããšãã«å¿
èŠãªãã§ãã¯ã
é·æïŒããããæéã®æŒžè¿ã¢ã«ãŽãªãºã ã
çæïŒé ãã
ã倧ããªå®æ°ã§ãæ倧5000ã®ãªãŒããŒã®nãŸã§ããæ©èœãããOïŒn
2 ïŒã®ã¡ã¢ãªãæ¶è²»ããŸãã
ä¿¡ããããªãã»ã©å°ããªé ããå®æ°ãæã€OïŒn 4 log nïŒã®ç©èªïŒ6
çªç¶ã
ãã®ã³ã¡ã³ãããã®ãŠãŒã¶ãŒã®æåº
erwins22ããã5ä¹ã11ã§é€ç®ããããšã«ãã£ãŠåŸãããæ®å·®ãèæ
®ããŸããã€ãŸããaãx
5 = a mod 11ãšæ¯èŒã§ãããã®ã§ã
ãaã®å¯èœãªå€ã¯0ã1ããã³-1ïŒmod 11ïŒïŒãèªèº«ã§ç¢ºèªããŠãã ããïŒã
次ã«ãçåŒa
5 + b
5 + c
5 + d
5 = e
5ãŠããããšãã€ãã¹ãŠãããã§ã¯ãåèšæ°ã¯å¶æ°ã§ããïŒããªãã£ãåæããããã«äºãã«ãã©ã³ã¹ããšãå¿
èŠããããŸãïŒãæ°aãbãcã dãeã¯0ããã¢ãžã¥ãŒã«11ãŸã§ãã€ãŸã11ã§å²ã£ãå€ã«çžåœããŸãã1æ¹åã«åããŠã2ã€ã®ãªãã·ã§ã³ã®ãããããååŸããŸãã
ïŒa
5 + b
5 ïŒ+ïŒc
5 + d
5 ïŒ= e
5 ; e = 0 mod 11
ïŒe
5 -a
5 ïŒ-ïŒb
5 + c
5 ïŒ= d
5 ; d = 0 mod 11
ä¿¡ããããŸããããæ°å€xã11ã§å²ãåããå Žåãæ°å€x
5ã¯161051ã§å²ãåããŸãããããã£ãŠãäžèšã®çåŒã®å·ŠåŽã¯161051ã§å²ãåããã¯ãã§ãã ã芧ã®ãšãããäžèšã®åŒã§ã¯ãæ¬åŒ§ã䜿çšããŠæ¢ã«ããã€ãã®æ°å€ãæ
éã«ãã¢ãªã³ã°ãããŠããŸãã ããã§ãæåã®ãã©ã±ãããä¿®æ£ãããšã2çªç®ã®ãã©ã±ããã¯161051ã§å²ã£ããšãã«ãã¹ãŠã®å¯èœãª161051æ®åºã®ãã¡ã®1ã€ã ããæã€ããšãã§ããŸãããããã£ãŠãO ãã¹ãŠã調ã¹ãŠãçµæãæ£ç¢ºãª5床ïŒããšãã°ã5床ã®é
åã®åçŒé¡ïŒã§ãããã©ããã確èªãããšãOïŒn
4 log n / 161051ïŒã§ãã¹ãŠã®è§£ãèŠã€ãããŸãã ã³ãŒãïŒ
ã³ãŒã void tale5( int n ) { vector< pair< long long, int > > vec; for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) { long long a5 = (long long)a*a*a*a*a; long long b5 = (long long)b*b*b*b*b; if (a5 + b5 < (long long)n*n*n*n*n)
ãã®ãœãªã¥ãŒã·ã§ã³ã®äœæ¥æéïŒ
n | ïŒ1 | ïŒ2 | ïŒ3 | ïŒ4 | ïŒ5 | ïŒ6 |
---|
100 | 1563ms | 318ms | 490ms | 360ms | 82ms | 129ms |
200 | 40代 | 4140ms | 6728ms | 4339ms | 121ms | 140ms |
500 | 74m | 189 | 352ç§ | 177 | 516ms | 375ms |
1000 | | 55m | | 46m | 3119ms | 2559ms |
2000幎 | | | | | 22ç§ | 38代 |
5000 | | | | | 328 | 28m |
ãã®è¡šã¯ãn = 500ããã³n = 1000ã®å Žåããã®ãœãªã¥ãŒã·ã§ã³ãç«æ¹äœã®ãœãªã¥ãŒã·ã§ã³ãè¿œãæãããšãã瀺ããŠããŸãã ããããããã§ããã¥ãŒããã¯ãœãªã¥ãŒã·ã§ã³ã¯åŒ·ãè¿œãè¶ãå§ããŸãã 挞è¿çã圌女ã¯-ããªãã¯åœŒå¥³ã欺ãããšã¯ã§ããŸããã
é·æïŒéåžžã«åŒ·åãªã¯ãªããã³ã°ã
çæïŒæŒžè¿çãªåäœã倧ããããããã®ã¢ã€ãã¢ã3次解ã«çµã³ä»ããæ¹æ³ã¯æ確ã§ã¯ãããŸããã
ç©èªïŒ7 OïŒn 3 ïŒã®128ãããæ°
ã¢ãžã¥ãŒã«ã®ããªãã¯ãäžæçã«å¿ããŸãããïŒå°ãåŸã§èŠããŸãïŒïŒãããŠããã¥ãŒããã¯ãœãªã¥ãŒã·ã§ã³ãããçŽããŠãn> 5000ã§æ£ããåäœããããã«ããŸãã ãããè¡ãããã«ã128ãããæŽæ°ãå®è£
ããŸãã
ã³ãŒã typedef unsigned long long uint64; typedef pair< uint64, uint64 > uint128; uint128 operator+ (const uint128 & a, const uint128 & b) { uint128 re = make_pair( a.first + b.first, a.second + b.second ); if ( re.second < a.second ) re.first++; return re; } uint128 operator- (const uint128 & a, const uint128 & b) { uint128 re = make_pair( a.first - b.first, a.second - b.second ); if ( re.second > a.second ) re.first--; return re; } uint128 power5( int x ) { uint64 x2 = (uint64)x*x; uint64 x3 = (uint64)x2*x; uint128 re = make_pair( (uint64)0, (uint64)0 ); uint128 cur = make_pair( (uint64)0, x3 ); for (int i=0; i<63; i++) { if ((x2>>i)&1) re = re + cur; cur = cur + cur; } return re; } void tale7( int n ) { vector< pair< uint128, int > > vec = vector< pair< uint128, int > >( n*n/2 ); uint128 n5 = power5( n ); int ind = 0; for (int a=1; a<=n; a++) for (int b=a+1; b<=n; b++) { uint128 a5 = power5( a ); uint128 b5 = power5( b ); if (a5 + b5 < n5) vec[ind++] = make_pair( a5+b5, (a<<16)+b ); } sort( vec.begin(), vec.begin()+ind ); for (int e=1; e<=n; e++) { uint128 e5 = power5( e ); int i = 0, j = ind-1; while( i < j ) { while ( i < j && vec[i].first + vec[j].first > e5 ) j--; if ( vec[i].first + vec[j].first == e5 ) { int a = (vec[i].second >> 16); int b = (vec[i].second & ((1<<16)-1)); int c = (vec[j].second >> 16); int d = (vec[j].second & ((1<<16)-1)); if (b < c && gcd( a, gcd( gcd( b, c ), gcd( d, e ) ) ) == 1) printf( "%d^5 + %d^5 + %d^5 + %d^5 = %d^5\n", a, b, c, d, e ); } i++; } } }
å®äºããå¿
èŠã®ãã£ãæäœã¯ãå ç®ãš5ä¹ã§ãã ãŸã æžç®ãããããã®ãœãªã¥ãŒã·ã§ã³ã§ã¯å¿
èŠãããŸããããåŸã§å¿
èŠã«ãªããŸãã ãããã£ãŠãããããããŠãã ããã 128ãããã®æ°å€ã¯ãã¢ãšããŠå®è£
ãããŠãããããæ¢ã«<ã>ã=æäœããããå¿
èŠã«å¿ããŠæ£ç¢ºã«æ©èœããŸãã
æåã«ããã¯ãã«ã®ãµã€ãºãããã«èšå®ããŸãã æé©åã®ããã«ãããè¡ãããŠããããã§ã¯ãããŸããã64ãããã³ã³ãã€ã©ãçºèŠããã«ã¯é
ãããŸãã32ãããã§äœ¿çšã§ããã¡ã¢ãªã¯2 GBã®ã¿ã§ãã n = 10000ã®å Žåããã¯ã¿ãŒããšã«çŽ1.2 GBãå¿
èŠã§ãã push_backã䜿çšããŠãã¯ãã«ãå±éãããšãå±éäžã«æåŸã«2 GB以äžããã£ããã£ããŸãïŒé·ãNãã2 * Nã«å¢ããã«ã¯ã3 * Nã®äžéã¡ã¢ãªãå¿
èŠã§ãïŒã
n | ïŒ1 | ïŒ2 | ïŒ3 | ïŒ4 | ïŒ5 | ïŒ6 | ïŒ7 |
---|
100 | 1563ms | 318ms | 490ms | 360ms | 82ms | 129ms | 20ms |
200 | 40代 | 4140ms | 6728ms | 4339ms | 121ms | 140ms | 105ms |
500 | 74m | 189 | 352ç§ | 177 | 516ms | 375ms | 1014ms |
1000 | | 55m | | 46m | 3119ms | 2559ms | 7096ms |
2000幎 | | | | | 22ç§ | 38代 | 52代 |
5000 | | | | | 328 | 28m | 13m |
10,000 | | | | | | | 89m |
ããã°ã©ã ããœãªã¥ãŒã·ã§ã³ïŒ5ã«æ¯ã¹ãŠã»ãŒ2åé
ããªã£ãããšãããããŸãããæ°ããé£æ»äžèœã®ããŒã¯n = 10000ãåŸæããŸããïŒ
é·æïŒ n> 5000ã§ãªãŒããŒãããŒããªãããã«ãªããŸããã
çæïŒè§£æ±ºç5ã®2åé
ãåäœãã倧éã®ã¡ã¢ãªãæ¶è²»ããŸãã
é ãããå®æ°ãå°ããOïŒn 3 ïŒã®ç©èªïŒ8
11ã§å²ã£ããšãã®å°äœã«ã€ããŠããäžåºŠæãåºããŠãã ããã2ã€ã®çåŒããããŸãã
ïŒa
5 + b
5 ïŒ+ïŒc
5 + d
5 ïŒ= e
5 ; e = 0 mod 11
ïŒe
5 -a
5 ïŒ-ïŒb
5 + c
5 ïŒ= d
5 ; d = 0 mod 11
11ãæ³ãšãã5床ã®å°äœã«ã¯åžžã«0ã1ããŸãã¯-1ã®å°äœããããŸãã a <b <c <dãšãã圢åŒã®å¶çŽãåé€ããæ°å€ããããã©ã±ããããå¥ã®ãã©ã±ããã«ä»»æã«ç§»åãããŸãã ãã®åŸãïŒãã¹ãŠã®ã±ãŒã¹ãèæ
®ããããšã«ããïŒåãã©ã±ããã11ãæ³ãšããŠ0ã«çãããªãããã«ãã€ã§ã移åã§ããããšã瀺ãã®ã¯ç°¡åã§ããããã§ã¯ã1ããnãŸã§ã®æ°åã®ãã¹ãŠã®ãã¢ããœãŒããã5床ã®åèšãšå·®ãèŠã€ãã 11ã§å²ãåãããã®ã ããèŠããŠãããŠãã ããããããŠãæ®ãã®ãã¢ã¯åçŽã«æšãŠãããšãã§ããŸãã
ãã®äºå®ãå®åŒåã§ããŸãããã®ãããªãã¢ã®æ°ã¯ããã¢ã®ç·æ°ã®çŽ51/121ã«ãªããŸãïŒããããªããããªã®ããèããŠãã ããïŒã æ®å¿µãªããããã®ãããªãã¢ã®2ã€ã®é
åãä¿åããå¿
èŠããããŸãïŒåèšãšå·®åïŒãããã«ãããã¡ã¢ãªã²ã€ã³ã¯102/121ã«ãªããŸãã ãŸãã15ïŒ
ãåæžã§ãã ãããããã®åŸããããã®é
åã§å°ãå®è¡ããå¿
èŠããããŸãã
æåŸã«ãæè¯ã®ãã¥ãŒã¹ïŒå€æ°ã®1ã€ïŒãã¥ãŒããã¯ãœãªã¥ãŒã·ã§ã³ã§æãå€éšçïŒã11ã®ã¹ãããã§æŽçããã®ãçã«ããªã£ãŠããŸããæªããã¥ãŒã¹ã¯ãäž¡æ¹ã®ã¿ã€ãã®çåŒãå¥ã
ã«è§£æ±ºããå¿
èŠããããšããããšã§ãã æ²ããããšã«ãæ²ããããšã«ãããã¯ããœãªã¥ãŒã·ã§ã³ïŒ6ã®ããã«11
5åã§ã¯ãªããããã°ã©ã ã11åã ãé«éåããŸãïŒå®éããŸã äºå®ã§ã¯ãããŸããïŒã
ã³ãŒã void tale8( int n ) { vector< pair< uint128, pair< int, int > > > vec_p, vec_m; uint128 n5 = power5( n ); for (int a=1; a<=n; a++) for (int b=1; b<a; b++) { uint128 a5 = power5( a ); uint128 b5 = power5( b ); int A = a%11; int B = b%11; int A5 = (A*A*A*A*A)%11; int B5 = (B*B*B*B*B)%11; if ( (A5+B5)%11 == 0 ) vec_p.push_back( make_pair( a5+b5, make_pair( a, b ) ) ); if ( (A5-B5+11)%11 == 0) vec_m.push_back( make_pair( a5-b5, make_pair( a, b ) ) ); } sort( vec_p.begin(), vec_p.end() ); sort( vec_m.begin(), vec_m.end() );
ããã§ã¯ããã¯ã¿ãŒã®å±éã«ããã幞éã§ãããn = 10000ã®ããã°ã©ã ã¯2GBã«åãŸããŸãã
n | ïŒ1 | ïŒ2 | ïŒ3 | ïŒ4 | ïŒ5 | ïŒ6 | ïŒ7 | ïŒ8 |
---|
100 | 1563ms | 318ms | 490ms | 360ms | 82ms | 129ms | 20ms | 16ms |
200 | 40代 | 4140ms | 6728ms | 4339ms | 121ms | 140ms | 105ms | 49ms |
500 | 74m | 189 | 352ç§ | 177 | 516ms | 375ms | 1014ms | 472ms |
1000 | | 55m | | 46m | 3119ms | 2559ms | 7096ms | 2110ms |
2000幎 | | | | | 22ç§ | 38代 | 52代 | 13ç§ |
5000 | | | | | 328 | 28m | 13m | 161s |
10,000 | | | | | | | 89m | 20m |
æ²ããããªãããã°ã©ã ã¯4.5åã ãå éããŸããã ã芧ã®ãšããã2çªç®ã®åŒã®å€æ°ã®ãã§ãã¯ã«ãããé ããå®æ°ã倧ããæãªãããŠããŸãã ãŸããäœããæé©åã®äœå°ã¯ãŸã ãããŸããã ä»æ倧ã®åé¡ïŒéçã®ã¡ã¢ãªæ¶è²»ã çŸåšã®ã¬ã³ãŒãã«éã«åãããã«nããã§ã«èš±å®¹ã§ããå Žåãã¡ã¢ãªããã¯é©åããªããªããŸãã
é·æïŒããããæéã®ãœãªã¥ãŒã·ã§ã³ãææ¡ãããŸããã
çæïŒäŸç¶ãšããŠã¡ã¢ãªæ¶è²»éãå€ããšããåé¡ã
OïŒn 3 log nïŒã®ã¡ã¢ãªæ¶è²»éãOïŒnïŒã®å Žåã®ç©èªïŒ9
ã¡ã¢ãªæ¶è²»ãã©ã®ããã«åæžããŸããïŒ
ããã§èª¬æããããªãã¯ã掻çšããŸãããã ããªãã¡ãnããã倧ããçŽ æ°pãåããŸãããããŸãå€ãã¯åããŸããã ç§ãã¡ãæã£ãŠããæåã®æ¹çšåŒãèããŸãïŒ2çªç®ã®æ¹çšåŒãåæ§ã«èããããŸãïŒïŒ
ïŒa
5 + b
5 ïŒ+ïŒc
5 + d
5 ïŒ= e
5 ; e = 0 mod 11
次ã«ãïŒa
5 + b
5 ïŒ= w mod pã0ããp-1ãŸã§ã®äžéšã®wãšããŸãã ãã®æ¯èŒãæºãããã¢ïŒaãbïŒã®æ°ã¯ç·åœ¢æ°ã§ãã ããã瀺ãããã«ããã©ã¡ãŒã¿ãŒaã1ããnãŸã§ç¹°ãè¿ããŸãã 次ã«ãbãèŠã€ããã«ã¯ãb
5 =ïŒw-a
5 ïŒ= u mod pãšããæ¯èŒã解ãå¿
èŠããããŸãã ãããŠããã®æ¯èŒã«ã¯åžžã«1ã€ä»¥äžã®è§£æ±ºçã¯ãªããšäž»åŒµãããŠããŸãã ããã¯ã
e-maxxã®ãã®ããŒãžããç¶ããŸãã ããã§ã1ã€ãããã¹ãŠã®è§£ãåŸãããã®å
¬åŒã«æ³šæãæãå¿
èŠããããŸãã
ã€ãŸãããã¹ãŠã®è§£ã®äžã§ãgcdïŒ5ãphiïŒpïŒïŒ= gcdïŒ5ãp-1ïŒã§ãã ã€ãŸããp = 5q + 1ã®å Žåã5ã€ã®ãœãªã¥ãŒã·ã§ã³ïŒãŸãã¯ãªãïŒããããæ®ãã®ã±ãŒã¹ã§ã¯1ã€ãããœãªã¥ãŒã·ã§ã³ããããŸããã
ïŒã¡ãªã¿ã«ããã®åŒã®ç±æ¥ãšåäœã¯ããããŸããããœãŒã¹ãç¥ã£ãŠãã人ãããå Žåã¯ãã©ãã§æ確ã«èšè¿°ãããŠãããããªã³ã¯ãå
±æããŠãã ãããïŒ
ããã§åé¡ã¯ãåºå®uã®bãèŠã€ããæ¹æ³ã§ããïŒ ãããäžåºŠã ãããããè¿
éã«è¡ãã«ã¯ãæ°åã®çè«ãããªãç解ããå¿
èŠããããŸãã ããããuã®ãã¹ãŠã®å¯èœãªå€ã«å¯ŸããŠbãå¿
èŠãªã®ã§ãåbã«å¯ŸããŠuãèŠã€ããŠãã¬ãŒãã«æžã蟌ãããšãã§ããŸãããã®ãããªuã®å Žåããã®ãããªè§£ã¯bã§ãã
ããã«ãåºå®wããã³åºå®e
5ã®å ŽåãïŒc
5 + d
5 ïŒ=ïŒe
5 -wïŒmod pãåŸãããŸãã æ¯èŒãæºããç·åœ¢ã®æ°ã®ãã¢ããããŸãã
ã€ãŸããåºå®ã®wãšåºå®ã®eã«å¯ŸããŠããœãŒãããå¿
èŠãããç·åœ¢ã®æ°ã®ãã¢ãååŸãïŒæ®å¿µãªããšã«ã挞è¿ç·ã®äœåãªå¯Ÿæ°ãããã«è¡šç€ºãããŸãïŒã2ã€ã®ãã€ã³ã¿ãŒã䜿çšããŸãã wãšeã®ç°ãªãå€ã¯æ¬¡æ°OïŒnïŒã§ãããããäžè¬çãªæŒžè¿æåã¯OïŒn
3 log nïŒã§ãã
æããã¹ãã³ãŒããæžããŸãããïŒ
ã³ãŒã bool is_prime( int x ) { if (x<2) return false; for (int a=2; a*a<=x; a++) if (x%a==0) return false; return true; } void tale9( int n ) { int p = n+1; while ( p%5==1 || !is_prime( p ) ) p++; vector< int > sols = vector< int >( p, -1 ); for (int i=1; i<=n; i++) { uint64 tmp = ((uint64)i*i)%p; tmp = (((tmp*tmp)%p)*i)%p; sols[(unsigned int)tmp] = i; } for (int w=0; w<p; w++) {
ãã®æ®é
·ãªããªããå®è¡ããŸãïŒn | ïŒ1 | ïŒ2 | ïŒ3 | ïŒ4 | ïŒ5 | ïŒ6 | ïŒ7 | ïŒ8 | ïŒ9 |
---|
100 | 1563ms | 318ms | 490ms | 360ms | 82ms | 129ms | 20ms | 16ms | 219ms |
200 | 40代 | 4140ms | 6728ms | 4339ms | 121ms | 140ms | 105ms | 49ms | 1741ms |
500 | 74m | 189 | 352ç§ | 177 | 516ms | 375ms | 1014ms | 472ms | 25ç§ |
1000 | | 55m | | 46m | 3119ms | 2559ms | 7096ms | 2110ms | 200代 |
2000幎 | | | | | 22ç§ | 38代 | 52代 | 13ç§ | 28m |
5000 | | | | | 328 | 28m | 13m | 161s | |
10,000 | | | | | | | 89m | 20m | |
玳士ãç³åšæ代ãžããããïŒãªãããã¯äžæ¬lyã«é
ããªãã®ã§ããïŒããããã3ã€ã®å
¥ãåã«ãªã£ãã«ãŒãã®äžçªäžã«power5ïŒïŒé¢æ°ããããã«ãŒãå
ã§æ¢ã«63åã®å埩ãè¡ãããŠããŸããçµã¿èŸŒã¿é¢æ°ãæžãæããŸããïŒéãã«ã次ã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãäºåã«èšç®ããããã¬ãŒãããçãããã©ãã°ããã ãã§ããããããä»ã§ã¯ã¡ã¢ãªãã»ãšãã©æ¶è²»ããã1ã€ã®éåžžã«äŸ¿å©ãªããããã£ãç»å ŽããŸãããã¿ã¹ã¯ãç¬ç«ãããµãã¿ã¹ã¯ã«åå²ã§ããããã«ãªããŸãããã€ãŸããã䞊ååããã€ãŸãèšç®ãè€æ°ã®ã³ã¢ã«åæ£ã§ããŸãã€ãŸããåã³ã¢ã«å¯ŸããŠããã©ã¡ãŒã¿ãŒwã®ç¬èªã®å€ãæå®ããŸãããããã®wã0ããp-1ãŸã§ã®ãã¹ãŠã®æ°å€ã§ã«ããŒããå Žåãåé¡ã®ãã¹ãŠã®ã±ãŒã¹ãã«ããŒããŸããããã¹ãŠã®ã«ãŒãã«ã®è² è·ã¯ã»ãŒåçã«åæ£ãããŸããé·æïŒããããªã¡ã¢ãªããæ¶è²»ãããåæ£ã³ã³ãã¥ãŒãã£ã³ã°ããµããŒãããŸããçæïŒäºæ¥é
ãã®éŽå±ã®ããã«é
ããªããŸããçéå
¥ãã®æé©åã«ããOïŒn 3 log nïŒã®ç©èªïŒ10
ãœãªã¥ãŒã·ã§ã³ïŒ9ãæ¡çšããããŒãã³ã¢ãªæé©åãè¿œå ããŸãããŸããå®éã圌ãã¯ããã»ã©ããŒãã³ã¢ã§ã¯ãããŸããããããããããã®å€ãããããŸãã- èšç®ã®ã¿å¯èœãªãã¹ãŠãèšç®ããã¿ãã¬ããã«é
眮ããŸãã
- push_backsã§ãã¯ã¿ãŒãæåŠããéçé
åã§ãã¹ãŠãããçŽããŸãã
- å¯èœãªéããé€ç®ã®æ®ããå®è¡ããæäœãåé€ããŸãã
- ãã¢ã®é
åã§ã¯ã5床ã®åèšïŒãŸãã¯å·®ïŒã®ã¿ãä¿åãã解ãèŠã€ãã£ãå Žåã«ã®ã¿ãã¢èªäœãå埩ãè©Šã¿ãŸãïŒè§£ã¯éåžžã«ãŸãã§ããããããã¢ã¯æ£æ¹åœ¢ã«ã€ããŠæãã«æ€çŽ¢ãããŸãïŒã
- eãšdã«ãã£ãŠã«ãŒãå
ã§çæãããé
åã¯ãå¹³åã§2åçããªããŸãããå®éãïŒa 5 + b 5ïŒ+ïŒc 5 + d 5ïŒ= e 5ã®å ŽåãïŒc 5 + d 5ïŒ<e 5ïŒå°ããªeã«é©ããŠããŸãïŒãããã³ïŒe 5 -a 5ïŒ-ïŒb 5 + c 5ïŒ= d 5ïŒe 5 -a 5ïŒ> d 5ïŒå€§ããªdã«é©ããŠããŸãïŒã®ã¿ã«é¢å¿ããããŸãã
ãããŠãã³ãŒããååŸããŸããã³ãŒã #define MAXN 100500 int pow5modp[MAXN]; int sols[MAXN]; uint128 vec1[MAXN], vec2[MAXN]; int vec1_sz, vec2_sz; uint128 pow5[MAXN]; int pow5mod11[MAXN]; void init_arrays( int n, int p ) { for (int i=1; i<=n; i++) { uint64 i5p = ((uint64)i*i)%p; i5p = (((i5p*i5p)%p)*i)%p; pow5modp[i] = (int)i5p; } for (int i=0; i<p; i++) sols[i] = -1; for (int i=1; i<=n; i++) sols[pow5modp[i]] = i; for (int i=1; i<=n; i++) pow5[i] = power5(i); for (int i=1; i<=n; i++) { int ii = i%11; pow5mod11[i] = (ii*ii*ii*ii*ii)%11; } } void tale10( int n, int start=0, int step=1 ) { int p = n+1; while ( p%5==1 || !is_prime( p ) ) p++; init_arrays( n, p ); for (int w=start; w<p; w+=step) { cerr << "n=" << n << " p=" << p << " w=" << w << "\n"; // (a^5 + b^5) + (c^5 + d^5) = e^5 // (a^5 + b^5) = w (mod p) vec1_sz = 0; for (int a=1; a<=n; a++) { int tmp = w - pow5modp[a]; int b = sols[ tmp<0 ? tmp+p : tmp ]; if (b!=-1 && b<a) if ( (pow5mod11[a]+pow5mod11[b])%11 == 0 ) vec1[vec1_sz++] = pow5[a]+pow5[b]; } sort( vec1, vec1 + vec1_sz ); for (int e=11; e<=n; e+=11) { // (a^5 + b^5) + (c^5 + d^5) = e^5 // (a^5 + b^5) = w (mod p) // (c^5 + d^5) = (e^5 - w) = q (mod p) int q = (int)((pow5modp[e] - w + p)%p); uint128 e5 = pow5[e]; vec2_sz = 0; for (int c=1; c<e; c++) { int tmp = q - pow5modp[c]; int d = sols[ tmp<0 ? tmp+p : tmp ]; if (d!=-1 && d<c) if ( pow5mod11[c]+pow5mod11[d]==0 || pow5mod11[c]+pow5mod11[d]==11 ) { uint128 s = pow5[c]+pow5[d]; if (s < e5) vec2[vec2_sz++] = s; } } sort( vec2, vec2 + vec2_sz ); int i = 0, j = vec2_sz-1, mx_i = vec1_sz-1; while( i < mx_i && j >= 0 ) { while ( j >= 0 && vec1[i] + vec2[j] > e5 ) j--; if ( j >= 0 && vec1[i] + vec2[j] == e5 ) { int a=-1, b=-1, c=-1, d=-1; for (int A=1; A<=n; A++) for (int B=1; B<A; B++) if (pow5[A]+pow5[B]==vec1[i]) { a=A; b=B; } for (int C=1; C<=n; C++) for (int D=1; D<C; D++) if (pow5[C]+pow5[D]==vec2[j]) { c=C; d=D; } if (gcd( a, gcd( gcd( b, c ), gcd( d, e ) ) ) == 1) printf( "%d^5 + %d^5 + %d^5 + %d^5 = %d^5\n", a, b, c, d, e ); } i++; } } // (e^5 - a^5) - (b^5 + c^5) = d^5 // (b^5 + c^5) = w (mod p) // already computed as vec1 for (int d=11; d<=n; d+=11) { // (e^5 - a^5) = (d^5 + w) = q (mod p) int q = (int)((pow5modp[d] + w)%p); uint128 d5 = pow5[d]; vec2_sz = 0; for (int e=d+1; e<=n; e++) { int tmp = pow5modp[e]-q; int a = sols[ tmp<0 ? tmp+p : tmp ]; if (a!=-1 && a<e) if ( pow5mod11[e]==pow5mod11[a] ) { uint128 s = pow5[e]-pow5[a]; if (s > d5) vec2[vec2_sz++] = s; } } sort( vec2, vec2 + vec2_sz ); int i = 0, j = 0, mx_i = vec2_sz, mx_j = vec1_sz; while (i < mx_i && j < mx_j) { while (j < mx_j && vec2[i] > vec1[j] && vec2[i] - vec1[j] > d5) j++; if ( j < mx_j && vec2[i] > vec1[j] && vec2[i] - vec1[j] == d5 ) { int e=-1, a=-1, b=-1, c=-1; for (int E=1; E<=n; E++) for (int A=1; A<E; A++) if (pow5[E]-pow5[A]==vec2[i]) { e = E; a = A; } for (int B=1; B<=n; B++) for (int C=1; C<B; C++) if (pow5[B]+pow5[C]==vec1[j]) { b = B; c = B; } if (gcd( a, gcd( gcd( b, c ), gcd( d, e ) ) ) == 1) printf( "%d^5 + %d^5 + %d^5 + %d^5 = %d^5\n", a, b, c, d, e ); } i++; } } } }
ã³ãŒãã¯ãããã³ã³ãã¯ãã§ã·ã³ãã«ã§èŠªåã«ãªããŸããããããŠåœŒã¯ããéããªããŸããïŒn | ïŒ1 | ïŒ2 | ïŒ3 | ïŒ4 | ïŒ5 | ïŒ6 | ïŒ7 | ïŒ8 | ïŒ9 | ïŒ10 |
---|
100 | 1563ms | 318ms | 490ms | 360ms | 82ms | 129ms | 20ms | 16ms | 219ms | 8ms |
200 | 40代 | 4140ms | 6728ms | 4339ms | 121ms | 140ms | 105ms | 49ms | 1741ms | 30ms |
500 | 74m | 189 | 352ç§ | 177 | 516ms | 375ms | 1014ms | 472ms | 25ç§ | 379ms |
1000 | | 55m | | 46m | 3119ms | 2559ms | 7096ms | 2110ms | 200代 | 2993ms |
2000幎 | | | | | 22ç§ | 38代 | 52代 | 13ç§ | 28m | 24ç§ |
5000 | | | | | 328 | 28m | 13m | 161s | | 405s |
10,000 | | | | | | | 89m | 20m | | 59m |
å€å°ã®æšããª10 MBã®ã¡ã¢ãªã䜿çšããŠãn = 10000ã®ãã¹ãŠã®ãªãã·ã§ã³ãå€å°èš±å®¹ã§ããæéã§ãã§ãã¯ããŸãããé·æïŒååã«éããã»ãšãã©ã¡ã¢ãªãæ¶è²»ããŸãããçæïŒããã§ã¯ãããŸãããããšã話ã«ãã説æãããã³ã«ããããŸãã
ãããŠä»ãç§ã¯64ãããã®ã³ã³ãã€ã©ãŒã6ã³ã¢ã®i7-5820K 3.3GHzãš4ã³ã¢ã®i7-3770 3.4GHzãã¯ã€ãã¬ãã°ããåãåºãã16ã®ç¬ç«ããã¹ããªãŒã ã§æ°æ¥éãœãªã¥ãŒã·ã§ã³ïŒ10ãå®è¡ããŸããn | ç·ã³ã¢ | ãªã¢ã«ã¿ã€ã | ã¹ããªãŒã |
---|
10,000 | 29m | 29m | 1 |
20000 | 318m | 58m | 6 |
50,000 | 105æé | 7æé | 16 |
100,000 | 970h | 62æé | 16 |
n = 100000ã®æ£ç¢ºãªæé00 221897112ms
01 221697012ms
02 221413313ms
03 219200228ms
04 222362721ms
05 221386814ms
06 221880726ms
07 219676217ms **
08 222212701ms
09 221865811ms
10 213299815ms *
11 211880251ms
12 211634584ms **
13 210114095ms
14 211691320ms *
15 212125515ms
* found 27^5 + 133^5 + 133^5 + 110^5 = 144^5
** found 85282^5 + 28969^5 + 28969^5 + 55^5 = 85359^5
00-09 : i7-5820K 3.3GHz
10-15 : i7-3770 3.4GHz
sum ~ 970h
max ~ 62h
ããé«éãªãã·ã³ã§ã®64ãããããã°ã©ã ïŒä»¥åã«i5-2410M 2.3Ghzã§ã³ãŒãããã¹ãããããšãæãåºããŠãã ããïŒã¯ãçŽ2åéãåäœããŸãããã®çµæããã©ãã°N = 100000ã«ç®¡çãããææã®ãã£ãªãã¡ã³ãã¹æ¹çšåŒã®ç¬¬äºã®è§£æ±ºçãèŠã€ããããšïŒ55 5 + 3183 5 + 28969 5 + 85282 5 = 85359 5ããšã話ã¯ããã§ããããã®äžã®ãã³ã
ãã®ãããããã§ã¯æéã®æŒžè¿çæ¯ãèããå®éã«ã¯æè¯ã§ã¯ãªãæéã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸãããçè«çã«ã¯ãã³ãŒããé«éåãããã察æ°ã挞è¿ç·ããåãæšãŠãããšãã§ããŸãããçŸæç¹ã§ã¯æé©åã«ããããããŠããŸã-ãã§ã«ååãªæéã倱ã£ãŠããŸãã解決çã®å¯Ÿæ°ã«é¢ããŠã¯ãã¯ã€ãã¯ãœãŒããåºæ°ãœãŒãã«çœ®ãæããŸãïŒãã ããå®æ°ã¯å®å®æ¬¡å
ã«å¢å ããŸãïŒããŸãã¯2ã€ã®ãã€ã³ã¿ãŒã®ã¢ã€ãã¢ã®ä»£ããã«ããã·ã¥ããŒãã«ã䜿çšããŸãïŒããã§ã¯ãã©ã¡ããå®éã«éãããæ¢ã«ç¢ºèªããŠç¢ºèªããå¿
èŠããããŸãïŒããããã¡ã€ãªã³ã°ã«ãããn = 10000ã®å ŽåããœãŒãã¯å
šäœã®çŽååã«ãªããŸããã€ãŸããnã®å€ãå°ããå Žåã察æ°ã¯éåžžã«èš±å®¹ç¯å²ã§ããå éã«é¢ããŠã¯ã確ãã«ãããã°ã©ã ã5ã10åé«éåã§ããã¢ãžã¥ãŒã«ã«ã¯ãŸã ããã€ãã®ããªãã¯ããããŸãããã©ãã°ïŒ
ãŸããnã100äžåãŸã§ãã¹ãŠãã§ãã¯ãããšããã¯ã€ã«ããªã¢ã€ãã¢ããããŸããäºæ³ãããæ€èšŒæéã¯ãååãšããŠçŸå®çã§ãããçŽ100äžã³ã¢æéã§ããããããããã«å¯Ÿããç§ã®èœåã¯æããã«ååã§ã¯ãããŸãããäžç·ã«åŒã£åŒµãïŒãããã誰ãæ¢ã«æŽçãããã«ã€ããŠã®æ
å ±ã¯èŠã€ãããŸããã§ããããã¹ãŠãé·ãéæ°ããããŠããã®ã§ãçŸäžãŸã§èª¿ã¹ãŠãæå³ããªããããããŸããã誰ããããã«é¢ããæ
å ±ãæã£ãŠãããªããéäŒããŠãã ãããããã§ç©èªã¯çµããã誰ããã¹ã¿ãŒããã-ãããã£ãïŒ