找回密码
 欢迎注册
楼主: 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.         
  23.         hBase.DecLShift(1) += 27;
  24.     } while ( ++k <= 1024 );

  25.     HugeCalc::EnableTimer( FALSE );

  26.     printf( "\n" );

  27.     system( "pause" );

  28.     return 0;
  29. }
复制代码
运行结果为:

  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-5-4 01:35 , Processed in 0.058789 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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