明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: cabinsummer

[风之影][Lisp大挑战第一季]圆周率

    [复制链接]
 楼主| 发表于 2011-11-8 06:19 来自手机 | 显示全部楼层
jicqj 发表于 2011-11-5 19:57 大学时候用c语言玩过圆周率 , 但是不能和大师比啊

思路是什么?可以在lisp里尝试一下
发表于 2011-11-8 17:45 | 显示全部楼层
看眼界了,希望多来点这种有挑战性的,可以看到更多的大师浮出水面!
 楼主| 发表于 2011-11-11 19:48 | 显示全部楼层
遗憾,计算4000位时竟然出错了
 楼主| 发表于 2011-11-12 09:45 | 显示全部楼层
cabinsummer 发表于 2011-11-11 19:48
遗憾,计算4000位时竟然出错了

找到原因了,不是算法问题,是输出字符串函数的问题。LISP只能处理的字符串最多只能有4096个字符

评分

参与人数 1明经币 +1 金钱 +30 收起 理由
highflybir + 1 + 30 楼主有心人一个。

查看全部评分

发表于 2011-11-12 16:57 | 显示全部楼层
cabinsummer 发表于 2011-11-12 09:45
找到原因了,不是算法问题,是输出字符串函数的问题。LISP只能处理的字符串最多只能有4096个字符

哇  原来如此
发表于 2011-11-16 21:12 | 显示全部楼层
小弟不才,搞个最简单的,还是在朋友们的帮助下完成的.先贴上,慢慢搞一个莱布尼兹,再搞马青...
(defun C:uu();密率π=355/113,π=16arctan1/5-4arctan1/239马青公式
(setq fz 355)
(setq fm 113)
(setq n 0)
(setq lpai nil)
(repeat 30       
        (setq shang (fix (/ fz fm)));求商
          (setq fz (rem fz fm));求余数
        (setq lpai(append lpai (list shang)));第一个参数,每一个除法
        (setq fz (* fz 10))
        (setq n (+ n 1))
);repeat
lpai
)
结果:7位小数精度3. 1 4 1 5 9 2 9 2 0 3 5 3 9 8 2 3 0 0 8 8 4 9 5 5 7 5 2 2 1
是表的形式,小数点是我手加上去的.这两步以后再完善.

评分

参与人数 1明经币 +1 收起 理由
cabinsummer + 1 比祖冲之强多了

查看全部评分

发表于 2011-11-16 23:38 | 显示全部楼层
问题很有趣,前些日子编了一下,始终比Highflybird兄的外星人代码算法慢许多,采用的是Machin算法,大数计算。一直想改进后再发的,不过近日开始忙碌了,就先到此为止,先发下,以后再慢慢改进吧。
希望cabinsummer多出些有趣的题目来做 :)
  1. ;;; By qjchen@gmail.com ,采用Machin算法,不过由于采用了大数计算,速度随n增大急剧下降,
  2. ;;; 应该是O(n2)的算法,以后再改进吧,大概只能算800位内时间还能接受,更大的就不要了
  3. ;;; 远比不上Highflybird兄的外星人算法
  4. ;;; 2011.11.16
  5. (defun q:math:big+(a b n / f i res x)
  6.   (setq i (1- n) f 0)
  7.   (repeat n
  8.     (if (> (setq x (+ (nth i a) (nth i b) f)) 10000) (setq x (- x 10000) f 1) (setq f 0))
  9.     (setq res (cons x res) i (1- i))
  10.   )
  11.   res
  12. )

  13. (defun q:math:big-(a b n / f i res x)
  14.   (setq i (1- n) f 0)
  15.   (repeat n
  16.     (if (< (setq x (- (nth i a) (nth i b) f)) 0) (setq x (+ x 10000) f 1) (setq f 0))
  17.     (setq res (cons x res) i (1- i))
  18.   )
  19.   res
  20. )

  21. (defun q:math:round(x)
  22. (setq y (fix x))
  23. (if (> (- x y) 0.5) (1+ y) y)
  24. )

  25. (defun q:math:bigdiv(a b n / c f i res x)
  26.   (setq i 0 f 0)
  27.   (repeat n
  28.     (setq c (+ (nth i a) (* f 10000))
  29.           x (fix (/ (+ c 0.1) b))
  30.           res (cons x res)
  31.           i (1+ i)
  32.           f (rem c b))
  33.   )
  34.   (reverse res)
  35. )

  36. (defun q:math:bigreci(f b n / c i res x)
  37.   (setq res (cons (fix (/ f b)) res)
  38.         f (rem f b)
  39.         i 1)
  40.   (while (< i n)
  41.     (setq c (* f 10000)
  42.           x (fix (/ (+ c 0.1) b))
  43.           res (cons x res) i (1+ i) f (rem c b))
  44.   )
  45.   (reverse res)
  46. )

  47. (defun q:math:inin (v n / res)
  48.   (repeat (1- n)
  49.     (setq res (cons 0 res))
  50.   )
  51.   (cons v res)
  52. )

  53. (defun q:pi:deal1(a b / i n1 n2 res)
  54.   (setq n1 (length a) n2 (length b) res b i 0)
  55.   (if (< n2 n1)
  56.      (repeat (- n1 n2)
  57.        (setq res (append res (list (nth (+ n2 i) a))) i (1+ i))
  58.      )
  59.   )
  60.   res
  61. )

  62. (defun q:math:arctg(k v zf N / i n2)
  63.   (setq i (q:math:round (/ (* N 23.1) (/ (log (* k k)) (log 10)))) nn i)
  64.   (while (>= i 0)
  65.     (setq n2 (1+ (q:math:round (/ (* (- nn i) N) nn))))
  66.     (if (> n2 N) (setq n2 N))
  67.     (setq c (q:math:bigreci v (1+ (* 2 i)) n2)
  68.           b1 (q:math:bigdiv b (* k k) n2)
  69.           b (q:pi:deal1 b b1)
  70.           b2 (q:math:big- c b n2)
  71.           b (q:pi:deal1 b b2)
  72.           i (1- i))
  73.   )
  74.   (setq b (q:math:bigdiv b k N))  
  75.   (if (> zf 0) (setq a (q:math:big+  a b N)) (setq a (q:math:big- a b N)) )
  76.   
  77. )

  78. (defun c:test( / n x x1 x2)
  79.   (setq N (getint "\n请输入所需的PI的位数(4的倍数):") N (+ 2 (fix (/ N 4)))
  80.         a (q:math:inin 0 N)
  81.         b (q:math:inin 0 N)
  82.         x1 (q:math:arctg 5 16 1 N)
  83.         x2 (q:math:arctg 239 4 -1 N))
  84.   (princ "\n")
  85.   (foreach x (reverse (cdr (reverse a))) (princ x))
  86.   (princ)
  87. )


  88. (princ "\n By qjchen@gmail.com, 算Pi,命令test")
  89. (princ)

评分

参与人数 2明经币 +2 收起 理由
cabinsummer + 1 很给力!
highflybir + 1 赞一个!大数计算对list的表运算来说,是有点.

查看全部评分

 楼主| 发表于 2011-11-17 06:14 | 显示全部楼层
qjchen 发表于 2011-11-16 23:38
问题很有趣,前些日子编了一下,始终比Highflybird兄的外星人代码算法慢许多,采用的是Machin算法,大数计算 ...

你的方法和我的方法大同小异,如果没有对稀疏数据的优化,速度是不可能提很快的。同样的算法,在VB上运行比LISP上快10倍以上。
 楼主| 发表于 2011-11-17 06:17 | 显示全部楼层
qjchen 发表于 2011-11-16 23:38
问题很有趣,前些日子编了一下,始终比Highflybird兄的外星人代码算法慢许多,采用的是Machin算法,大数计算 ...

qjchen兄可以去挑战一下第二季,光路计算
http://bbs.mjtd.com/thread-90226-1-1.html
发表于 2011-11-20 17:20 | 显示全部楼层
学习了
支持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-28 17:54 , Processed in 0.172539 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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