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

[擂台] 串珠素数问题

[复制链接]
 楼主| 发表于 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-4-17 00:37 , Processed in 0.047046 second(s), 17 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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