找回密码
 欢迎注册
楼主: 无心人

[擂台] 串珠素数问题

[复制链接]
 楼主| 发表于 2008-11-21 14:40:26 | 显示全部楼层
总也调不好程序 明明算法对 但通不过编译
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-21 15:15:49 | 显示全部楼层
import Primes readInt :: IO Int readInt = readLn parta p a n = fromIntegral \$ sum (take ((div n 3) + 1) (iterate (1000*) (10^(p-1)*a))) partb p b n = fromIntegral \$ sum (take ((div n 3) + (p - 1)) (iterate (1000*) (100^(2-p)*b))) partc p c n = fromIntegral \$ sum (take (div n 3) (iterate (1000*) (10^p*c))) isczPrime n = [(ns, a, b, c) | ns <- [4..n], let p = mod ns 3, p /= 0, let (aa, bb, cc) = if (p == 1) then ([1,3,7,9], [0..9],[0..9]) else ([1..9], [1, 3, 7, 9], [0..9]), a <- aa, b <- bb, c <- cc, (a /= c) || (b /= c), let pp = (parta p a ns) + (partb p b ns) + (partc p c ns), isPrime pp ] main = do putStrLn "Input Digits: " n <- readInt print (isczPrime n) 100内的结果 p3_100.txt (37.68 KB, 下载次数: 1) [ 本帖最后由 无心人 于 2008-11-21 20:15 编辑 ]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-21 16:22:07 | 显示全部楼层

100位内共有999个

其中, abcabc...abca 型的有536个, abcabc...abcab 型的有463个, 总和为 999 个。 无心人的结果似乎有些问题, 居然含有 (4,1,1,2),而 1121 = 19 * 59 总数目也少了些。

p3_100_HugeCalc.txt

70.82 KB, 下载次数: 1, 下载积分: 金币 -1 枚, 经验 1 点, 下载 1 次

100位内3串珠素数结果

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-21 16:22:57 | 显示全部楼层

对应代码

  1. //////////////////////////////////////////////////////////////////////////
  2. //
  3. // 目的:搜索串珠素数(形如abcabc...a(ab)的素数)
  4. // 设计:郭先强 ( gxqcn@163.com; HugeCalc@Gmail.com )
  5. // 日期:2008-11-21
  6. //
  7. // Web: http://www.emath.ac.cn/
  8. // BBS: http://bbs.emath.ac.cn/
  9. //
  10. //////////////////////////////////////////////////////////////////////////
  11. // Project -> Setting -> C/C++ -> Code Generation --> Use run-time library:
  12. // Win32 Debug: Debug Multithreaded DLL
  13. // Win32 Release: Multithreaded DLL
  14. #include <stdio.h>
  15. #include "../../../HugeCalc_API/CppAPI/Include/HugeCalc.h"
  16. #include "../../../HugeCalc_API/CppAPI/Include/HugeInt.h" // 10进制系统
  17. #pragma message( "automatic link to .../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
  18. #pragma comment( lib, "../../../HugeCalc_API/CppAPI/Lib/HugeCalc.lib" )
  19. #define MAX_DIGITS 100
  20. int main(int argc, char* argv[])
  21. {
  22. printf( "Call %s\n\n", HugeCalc::GetVer());
  23. if ( HC_LICENSE_NONE == HugeCalc::GetLicenseLevel() )
  24. {
  25. printf( "\n警告:您未通过 HugeCalc.dll 的许可认证!" \
  26. "\n解决方案可选下列方案之一:" \
  27. "\n 一、请将本程序移动到“/CopyrightByGuoXianqiang/[../]”目录下运行;" \
  28. "\n 二、或请在 HugeCalc.chm 中进行注册(一劳永逸)。" );
  29. }
  30. else
  31. {
  32. UINT32 n=0, a, b, c, s, count=0;
  33. CHugeInt stepA(1001), stepB, stepC, p;
  34. HugeCalc::EnableTimer();
  35. HugeCalc::ResetTimer();
  36. while(++n)
  37. {
  38. /* abcabc...abca 型 */
  39. if ( 3*n + 1 > MAX_DIGITS )
  40. {
  41. break;
  42. }
  43. ( stepC = stepA ).DecRShift( 2 );
  44. for ( a=1, p=stepA; a<10; a+=2, ++p+=stepA )
  45. {
  46. for ( b=0, s=(n+1)*a; b<10; ++b, s-=n*9 )
  47. {
  48. for ( c=0; c<10; ++c, s+=n )
  49. {
  50. if ( 0!=(s%3) && p.IsPrime() )
  51. {
  52. printf( "%s\tNo.%u\t(digits,a,b,c)=(%u,%u,%u,%u)\t%s\n",
  53. HugeCalc::GetTimerStr(), ++count, 3*n+1, a, b, c, (LPCTSTR)p );
  54. }
  55. p += stepC;
  56. }
  57. }
  58. }
  59. /* abcabc...abcab 型 */
  60. if ( 3*n + 2 > MAX_DIGITS )
  61. {
  62. break;
  63. }
  64. stepB = stepA;
  65. stepC.DecLShift( 1 );
  66. stepA.DecLShift( 1 );
  67. for ( a=1, (p=stepA)+=stepB; a<10; ++a )
  68. {
  69. for ( b=1, s=(n+1)*(a+b); b<10; b+=2, s-=n*8-2, ++p+=stepB )
  70. {
  71. for ( c=0; c<10; ++c, s+=n )
  72. {
  73. if ( 0!=(s%3) && p.IsPrime() )
  74. {
  75. printf( "%s\tNo.%u\t(digits,a,b,c)=(%u,%u,%u,%u)\t%s\n",
  76. HugeCalc::GetTimerStr(), ++count, 3*n+2, a, b, c, (LPCTSTR)p );
  77. }
  78. p += stepC;
  79. }
  80. }
  81. }
  82. ++stepA.DecLShift( 2 );
  83. }
  84. }
  85. system( "pause" );
  86. return 0;
  87. }
复制代码
运行 2.38 秒即可输出全部结果。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-21 17:13:49 | 显示全部楼层
可能有模式错误 刚学这个 好多东西要问别人 呵呵 我再修改去
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-21 18:48:58 | 显示全部楼层
找到问题了 b的模式有问题 =============== 在原帖处修改了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2008-11-21 19:47:32 | 显示全部楼层
看不到你的新结果, 现在可一致了? 这个用 HugeCalc 运行肯定要快很多。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-21 20:00:27 | 显示全部楼层
我对比你结果对了 但我这里在优化的过程里 又产生了个问题 正找人问呢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-21 20:09:56 | 显示全部楼层
我上面已经把程序改了 就是partb后面 起始数字是100^(2-p)*b 原来是10^(2-p)*b 马上把结果帖上去 优化后的问题还要等人回答呢 ========================================= 一直在修改的优化一点的程序 加上被3整除后出现了类型推定错误 经人指点,做了点修改,搞定了 import Primes readInt :: IO Int readInt = readLn parta p a n = fromIntegral \$ sum (take ((div n 3) + 1) (iterate (1000*) (10^(p-1)* toInteger a))) partb p b n = fromIntegral \$ sum (take ((div n 3) + (p - 1)) (iterate (1000*) (100^(2-p)* toInteger b))) partc p c n = fromIntegral \$ sum (take (div n 3) (iterate (1000*) (10^p* toInteger c))) isczPrime n = [(ns, a, b, c, pp) | ns <- [4..n], let p = ns \`mod\` 3, p /= 0, let (aa, bb, cc) = if (p == 1) then ([1,3,7,9], [0..9],[0..9]) else ([1..9], [1, 3, 7, 9], [0..9]), a <- aa, b <- bb, c <- cc, (a /= c) || (b /= c), let l = ns \`div\` 3, ((l + 1) * a + (l + p - 1) * b + l * c) \`mod\` 3 /= 0, let pp = (parta p a ns) + (partb p b ns) + (partc p c ns), isPrime pp ] main = do putStrLn "Input Digits: " n <- readInt print (isczPrime n) [[i] 本帖最后由 无心人 于 2008-11-21 21:42 编辑 [/i]]
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2008-11-21 20:18:38 | 显示全部楼层
下面讨论通用形 最多10个不同数字 最大100位数字 最小等于不同数字个数加一
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-12-22 15:35 , Processed in 0.040421 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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