找回密码
 欢迎注册
楼主: medie2005

[讨论] p^2=a^2&b^2

[复制链接]
发表于 2009-3-24 16:34:40 | 显示全部楼层
这类问题,若用暴力穷举,那就仅拼机器性能或运气了, 而这两样我都不具备,所以不敢尝试。。。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:35:24 | 显示全部楼层
  1. #include <gmp.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. mpz_t t;
  5. unsigned int d[4] = {0, 1, 4, 9}, maxlvl;
  6. mpz_t l[32];
  7. int check(int lvl, mpz_t n)
  8. {
  9. // gmp_printf("%Zd\n", n);
  10. if (mpz_perfect_square_p(n))
  11. {
  12. mpz_sqrt(t, n);
  13. if (mpz_probab_prime_p(t, 10) > 0)
  14. gmp_printf("%u: [%Zd, %Zd]\n", lvl, n, t);
  15. }
  16. }
  17. int circle(int lvl)
  18. {
  19. if (lvl < maxlvl)
  20. for (int i = 0; i < 4; i ++ )
  21. {
  22. mpz_mul_ui(l[lvl], l[lvl-1], 10);
  23. mpz_add_ui(l[lvl], l[lvl], d[i]);
  24. check(lvl+1, l[lvl]);
  25. circle(lvl + 1);
  26. }
  27. }
  28. int main(void)
  29. {
  30. int i;
  31. mpz_init(t);
  32. for (i = 0; i < 32; i ++)
  33. {
  34. mpz_init(l[i]);
  35. mpz_set_ui(l[i], 0);
  36. }
  37. printf("请输入最大数字长度:");
  38. scanf("%u", &maxlvl);
  39. for (i = 1; i < 4; i ++)
  40. {
  41. mpz_set_ui(l[0], d[i]);
  42. circle(1);
  43. }
  44. for (i = 0; i < 32; i ++)
  45. mpz_clear(l[i]);
  46. mpz_clear(t);
  47. return 0;
  48. }
复制代码
先程序代码奉上
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:37:06 | 显示全部楼层
gxq 有没有大幅度减枝的算法
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:41:43 | 显示全部楼层
原帖由 无心人 于 2009-3-24 16:37 发表 gxq 有没有大幅度减枝的算法
没及细想。 但粗略读了你的代码,不知下面两点你用上没有? 一、末尾需1或9; 二、数字总和不被3整除,也即 1的个数 + 4的个数 总和不被 3 整除。 当然,这是将目标锁定在素数的平方前提上。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:42:29 | 显示全部楼层
9: [100140049, 10007] 13: [1004499049009, 1002247] 11: [10110101401, 100549] 15: [101914011991009, 10095247] 9: [104919049, 10243] 7: [1100401, 1049] 14: [11004194004049, 3317257] 14: [11199109101049, 3346507] 5: [11449, 107] 13: [1144944940441, 1070021] 12: [144019491001, 379499] 11: [41110401049, 202757] 9: [414000409, 20347] 15: [419041411191001, 20470501] 15: [444999910990441, 21095021] 2: [49, 7] 12: [490001400001, 700001] 10: [4900140001, 70001] 8: [49014001, 7001] 15: [490400094910441, 22144979] 6: [491401, 701] 16: [9010901999944441, 94925771] 14: [90940044990001, 9536249] 4: [9409, 97] 10: [9409194001, 97001] 11: [94094949001, 306749] 6: [994009, 997] 14: [99400919940001, 9970001] 12: [994010994001, 997001] 好了,再加上 1: [4,2] 1: [9,3] 16位内的带0的结果出来了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:43:37 | 显示全部楼层
TO GxQ 你这两个都不能加 除非是求固定位数的啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:46:02 | 显示全部楼层
不会吧? 那你可以从数字头部添加数字啊?
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:54:02 | 显示全部楼层
我想他gmp库里的判断平方数的函数应该利用了某些规则 据说判定63, 64, 65等几个数字的剩余就能淘汰95%以上 不知道他利用了么 我看他代码去 如果利用了 我想,并不需要再额外处理了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 17:04:06 | 显示全部楼层
看不懂 算了,不纠缠这个题目了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 17:11:07 | 显示全部楼层

另一个构造法

又有一个规律可用:(9k)7 ^ 2 = (9k)4(0k)9 (k>=1) 编代码如下:
  1. #include <stdio.h>
  2. #include "../../../HugeCalc_API/CppAPI/Include/HugeCalc.h" // 公共接口
  3. #include "../../../HugeCalc_API/CppAPI/Include/HugeInt.h" // 10进制系统
  4. #pragma message( "automatic link to ../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
  5. #pragma comment( lib, "../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
  6. int main(int argc, char* argv[])
  7. {
  8. // 初始化
  9. HugeCalc::EnableTimer( TRUE );
  10. HugeCalc::ResetTimer();
  11. // (9_k)7 ^ 2 = (9_k)4(0_k)9 (k>=1)
  12. CHugeInt hBase( 97 ), hSquare;
  13. UINT32 k=1;
  14. do
  15. {
  16. if ( hBase.IsPrime() )
  17. {
  18. printf( "\n%s\tk=%u\t", HugeCalc::GetTimerStr( FT_DOT06SEC_s ), k );
  19. // printf( "%s ^ 2 = ", (LPCTSTR)hBase );
  20. // printf( "%s", (LPCTSTR)hSquare.Pow( hBase, 2 ) );
  21. }
  22. hBase.DecLShift(1) += 27;
  23. } while ( ++k <= 1024 );
  24. HugeCalc::EnableTimer( FALSE );
  25. printf( "\n" );
  26. system( "pause" );
  27. return 0;
  28. }
复制代码
运行结果为:
  1. 0.000011 s k=1
  2. 0.000085 s k=2
  3. 0.000627 s k=16
  4. 0.069882 s k=139
  5. 13.765550 s k=989
  6. 请按任意键继续. . .
复制代码
如 k=16 时, 99999999999999997 ^ 2 = 9999999999999999400000000000000009 也可看作 Q3/Q4 的一个解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 22:53 , Processed in 0.036273 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表