无心人 发表于 2008-12-5 14:16:03

朴素的算法

Prelude> let facthi n m = if (n == m) then n else   if (n > m)then 1 else   (facthi n (n + (div (m - n) 2))) * (facthi (n + (div (m - n) 2) + 1) m)
Prelude> let fact n = fact 1 n
Prelude> let isT a n = (==) a \$ take (length a) \$ show n
Prelude> let test a = head \$ filter ((isT a) . fact)

无心人 发表于 2008-12-5 22:24:55

程序执行相当快,计算最后一项,只用几秒
修改start =log10(3.14159265), end = log10(3.14159266)等参数可继续计算
===========================
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

void main(void)
{
   double start, end, lnf = 0.0, a = 1.0;
   int i = 0, find = 0;
   
   start = log10(3.14159);
   end = log10(3.14160);
   
   while (i < 100000000)
   {
   lnf += log10(a);
   lnf -= floor(lnf);
   if ((lnf >= start) && (lnf <= end))
   {
   find = 1;
   break;
   }
   i ++;
   a += 1.0;
   }
   if (find)
   printf("find: %8.0f%0.15f", a, lnf);
   else
   printf("Not Find, Stop in ", a, lnf);
}

无心人 发表于 2008-12-5 22:53:49

测试了Double
10^8次累加10^(-8)
最后结果是1.000000002289867

但是,使用斯特林公式,需要计算的对数值要多
不知道,使用高精度的对数累加和使用斯特林公式
在超过10^8下哪个比较好
另外,20#的结果需要人核验
本来算出个超过10^8的新结果
现在看来,是否正确需要检验呢

mathe 发表于 2008-12-6 13:32:45

恩,反正都要计算所有的阶乘,直接对数累加应该是不错的方法。不过同样需要提高以下计算精度

无心人 发表于 2008-12-6 14:00:19

目前看,32位十进制以上精度是必须的
但不知道mpfr的浮点速度如何?
mathe测试过么?

mathe 发表于 2008-12-6 14:22:32

没试过。我现在机器重装以后,什么工具都没有了,也没有重装过

无心人 发表于 2008-12-6 17:12:28

验证阶乘前8位数字的程序,适用于100000000!以下
======================
import Time

less32 a = until (<10^32) (\`div\` 10) a

facthi :: Integer -> Integer -> Integer
facthi n m = if (n == m) then (less32 n) else
               if (n > m)then 1 else
               less32 \$ (facthi n (n + (div (m - n) 2))) * (facthi (n + (div (m - n) 2) + 1) m)

facth n = facthi 1 n

main = do
         t <- getClockTime
         let f = facth 65630447
         print f
         print t
         t <- getClockTime
         print t

无心人 发表于 2008-12-6 22:42:27

实际计算表明
选择最高位16个数字并不能保证最后结果前8位是正确的
所以,刚刚修改了上面的帖子
选择32位精度

测试程序在我下午5点多点在学校运行呢
结果,周一放上去,也同时确定了65630447!是否缺失以31415626开始
20#已经确认结果均正确
马上要用mpfr写个寻找31415265的

gxqcn 发表于 2008-12-8 08:34:11

原帖由 无心人 于 2008-12-5 13:27 发表 http://bbs.emath.ac.cn/images/common/back.gif
开始记录结果
d = 3, n = 9
d = 31, n = 62
d = 314, n = 62
d = 3141, n = 10044
d =31415, n = 50583
d = 314159, n = 1490717
d = 3141592, n =   5573998开始数字是3141592381
d = 31415926, n = 6563 ...

我记得 liangbch 曾写过指定精度的快速阶乘计算器,
可以指定保留任意位的有效精度,
用它来复测可能更好。

无心人 发表于 2008-12-8 08:52:03

哦?

呵呵
下个候选是1.3亿附近的
再下个可能就要10多亿了
再下个可能就是计算的极限了,大概500亿内
页: 1 2 [3] 4 5 6 7 8 9 10 11 12
查看完整版本: 阶乘和圆周率