首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Forth中检查素性

在Forth中检查素性
EN

Stack Overflow用户
提问于 2012-11-10 03:42:26
回答 1查看 380关注 0票数 2

如何在Forth中检查primality

下面是我现在使用的,但随着数字的增加,它会变得很慢:

代码语言:javascript
复制
: prime ( n - f )
  DUP 2 < IF 
    DROP 0 EXIT
  THEN
  DUP 2 ?DO
    DUP I I * < IF
      DROP -1 LEAVE
    THEN
    DUP I MOD 0= IF
      DROP 0 LEAVE
    THEN
  LOOP ;
EN

回答 1

Stack Overflow用户

发布于 2012-11-22 12:40:40

一种简单的概率方法是费马测试,你可以在维基百科上找到:

代码语言:javascript
复制
: *mod ( a b n -- n2 )
    */mod drop ;

: expmod { x e n -- n2 } \ compute x^e mod n by repeated squaring
    e 0= if 1 exit
    else
        x e 2/ n recurse dup n *mod
        e 1 and if x n *mod then 
    then ;

: prime ( n -- f )
    3 swap dup expmod 3 = ;

如果这个测试说数字是复合的,那么它肯定是复合的。如果它说这个数是质数,那么它可能就是质数,但有几个复合数会漏掉(这样的数被称为“伪素数”)。对于某些目的,测试是相当快和足够的。

你发布的代码测试因子2,3,4,5,...直到n的平方根,如果它测试2,3,5,7...因为即使是大于2的因子也不需要测试。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13314861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档