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

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

[复制链接]
发表于 2009-3-24 16:00:57 | 显示全部楼层
不搜索单个的了
浪费资源
改整体搜索了

  1. #include <gmp.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>

  4. mpz_t t;
  5. unsigned int d[3] = {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.        gmp_printf("%u: [%Zd, %Zd]\n", lvl, n, t);
  14.     }     
  15. }

  16. int circle(int lvl)
  17. {
  18.    if (lvl < maxlvl)
  19.      for (int i = 0; i < 3; i ++ )
  20.        {
  21.           mpz_mul_ui(l[lvl], l[lvl-1], 10);
  22.           mpz_add_ui(l[lvl], l[lvl], d[i]);
  23.           check(lvl+1, l[lvl]);
  24.           circle(lvl + 1);        
  25.        }
  26. }
  27. int main(void)
  28. {
  29.   int i;
  30.   mpz_init(t);
  31.   for (i = 0; i < 32; i ++)
  32.   {
  33.     mpz_init(l[i]);
  34.     mpz_set_ui(l[i], 0);
  35.   }
  36.   printf("请输入最大数字长度:");
  37.   scanf("%u", &maxlvl);
  38.   for (i = 0; i < 3; i ++)
  39.   {  
  40.     mpz_set_ui(l[0], d[i]);
  41.     circle(1);
  42.   }

  43.   for (i = 0; i < 32; i ++)
  44.     mpz_clear(l[i]);
  45.   mpz_clear(t);
  46.   return 0;
  47. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:01:06 | 显示全部楼层

构造法求解

原帖由 medie2005 于 2009-3-24 14:17 发表
谁来解Q4?


注意到:

1002020012 = 10040441004404001
100020200012 = 100040404100404040001
10000202000012 = 1000040400410040040400001
。。。
在100202001中“202”的两侧同时添上相同数目的“0”,其平方可仅由0、1、4构成,
这是我刚刚通过 HugeCalc 发现的,不知是否已有人总结出来了?

但上面最大的遗憾是其底数肯定为合数(因为其数字和=6,必被3整除)!


怎么办呢?


我继续使用 HugeCalc 去 try,又发现了一个类似的规律:
1002220012 = 10044449484444001
100022200012 = 100044404948404440001
10000222000012 = 1000044400494840044400001
。。。
即:$(10^(2k+2)+222*10^k+1)^2=10^(4k+2)+444*10^(3k+2)+49484*10^(2k)+444*10^k+1$
注意到右侧多出了一个8,虽然8不是完全平方数,但凑巧484=222
这样可将右侧看作是:4*(k-2)个“0”、2个“1”、7个“4”、1个“9”和1个“484”构成。
且现在底数将有可能为素数了。于是赶紧编程进行搜索。

代码如下:
  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.    
  12.     // 100 222 001
  13.     CHugeInt hHead( 100000000 );
  14.     CHugeInt hMid( 222000 );
  15.     CHugeInt hSum;

  16.     UINT32 k = 3;

  17.     do
  18.     {
  19.         ++(( hSum = hHead ) += hMid );
  20.         if ( hSum.IsPrime() )
  21.         {
  22.             printf( "\n%s\tk=%u\t", HugeCalc::GetTimerStr( FT_DOT06SEC_s ), k );
  23.             printf( "%s ^ 2 = ", (LPCTSTR)hSum );
  24.             printf( "%s", (LPCTSTR)hSum.Pow(2) );
  25.         }

  26.         hHead.DecLShift(2);
  27.         hMid.DecLShift(1);
  28.     } while ( ++k <= 1024 );
  29.    
  30.     printf( "\n" );
  31.     HugeCalc::EnableTimer( FALSE );   
  32.    
  33.     system( "pause" );
  34.    
  35.     return 0;
  36. }
复制代码
在 k <= 1024 范围内搜索其底数恰好为素数者,结果如下:
  1. 0.000183 s      k=4
  2. 0.047009 s      k=98
  3. 2.671768 s      k=300
  4. 19.800347 s     k=498
  5. 124.983792 s    k=788
  6. 187.051473 s    k=860
  7. 请按任意键继续. . .
复制代码
其中当 k=98 时,
1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000022200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 ^ 2 = 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000494840000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
可以看作 Q4 的一个解。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:03:19 | 显示全部楼层


所以他限定不能有0
否则平凡解太多了啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:06:07 | 显示全部楼层
刚去尝试暴力找28位以下的
后来一算
需要的时间忒多了点
(恐怕要几十年)
只好先找24位以下的了

这个也估计要几个小时到几天吧
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:06:36 | 显示全部楼层

回复 13# 无心人 的帖子

我没见他有如此限制。

当要求为素数的完全平方数,即便含上“0”也是凤毛麟角啊。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:08:02 | 显示全部楼层


不是吧
有0的很多吧

07^2 = 0049
007^2 = 000049
...
...

哈哈
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:18:23 | 显示全部楼层
3: [100, 10]
5: [10000, 100]
7: [1000000, 1000]
7: [1004004, 1002]
7: [1014049, 1007]
5: [10404, 102]
7: [1040400, 1020]
7: [1100401, 1049]  //素数
5: [11449, 107]   //素数
7: [1144900, 1070]
8: [11909401, 3451]
8: [14010049, 3743]
8: [14040009, 3747]
3: [144, 12]
5: [14400, 120]
7: [1440000, 1200]
4: [1444, 38]
6: [144400, 380]
8: [14440000, 3800]
5: [19044, 138]
7: [1904400, 1380]
7: [1940449, 1393]
8: [19909444, 4462]
3: [400, 20]
5: [40000, 200]
7: [4000000, 2000]
7: [4004001, 2001]
5: [40401, 201]
7: [4040100, 2010]
8: [40411449, 6357]
6: [419904, 648]
8: [41990400, 6480]
3: [441, 21]
5: [44100, 210]
7: [4410000, 2100]
5: [44944, 212]
7: [4494400, 2120]
2: [49, 7]
4: [4900, 70]
6: [490000, 700]
8: [49000000, 7000]
8: [49014001, 7001] //素数
6: [491401, 701] //素数
8: [49140100, 7010]
8: [49999041, 7071]
3: [900, 30]
5: [90000, 300]
7: [9000000, 3000]
6: [904401, 951]
8: [90440100, 9510]
4: [9409, 97] //素数
6: [940900, 970]
8: [94090000, 9700]
8: [94109401, 9701]
7: [9909904, 3148]
6: [994009, 997] //素数
8: [99400900, 9970]
7: [9941409, 3153]
8: [99940009, 9997]
如果不限制0
其中素数是6个
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:20:13 | 显示全部楼层
原帖由 无心人 于 2009-3-24 16:08 发表


不是吧
有0的很多吧

07^2 = 0049
007^2 = 000049
...
...

哈哈


但 0049 和 000049 它们代表的是同一个数,
应该不能算作不同的解。

所以即便加上“0”(其实它本身就是合法的,只是再肯定一下而已),
也不致于让问题难度退化到一般情形。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:29:37 | 显示全部楼层
不玩了

暴力穷举太消耗时间了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-3-24 16:32:16 | 显示全部楼层
1,4,9的留给有能力的去算吧
我只得到19位以下无比Q3大的了

响应郭老大的建议,我算下0, 1, 4, 9的16位以内的结果
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-5-4 08:49 , Processed in 0.052401 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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