斐波那契素数

2010年10月29日

最近编程挑战要求您解决以下问题:

找出大于给定输入数的最小素数斐波那契数。将一加到斐波那契素数上,找到结果的因子,并返回因子之和。例如,如果输入的数字是10,那么大于10的最小fibonacci素数是13,13+1=14的因子是2和7,它们的和是9。

您的任务是编写一个函数来解决该问题,然后将您的函数应用于输入编号227000。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页码:1 2

8对“斐波那契素数”的反应

  1. […]实践——Remco Niemeijer编写的斐波那契初级读物今天的编程实践练习与[…]中最长的回文练习面临同样的挑战

  2. My Haskell解决方案(请参阅http://bonsaicode.wordpress.com/2010/10/29/programming-praxis-fibonacci-primes网站/对于带有注释的版本):

    fibs::[整数]fibs=0:1:zipWith(+)fibs(尾部fibs)因子::Integer->[Integer]因子=f 2,其中f d n | n<d=[]|mod n d==0=d:f(d+1)(div n d)|否则=f(d+1)nisPrime::Integer->BoolisPrime n=因子n==[n]greplin::Integer->Integergreplin n=头[sum$因子(f+1)|f<-fibs,f>n,isPrime f]
  3. 格雷厄姆

    我承认,我在格雷普林挑战赛中使用了Sage(见sagemath.org)的甜美内置例程。
    这当然是作弊。祝贺雷姆科获得令人印象深刻的哈斯克尔,也祝贺你的计划能力和
    优秀的博客。

    鼠尾草:def greplin(n):….:对于fibonacci_xrange(n,10*n)中的f:….:如果是_素数(f):….:返回和([b代表系数(1+f)中的b,e)]……:鼠尾草:格雷普林(227000)352
  4. 凤山

    该死,我的代码和Remco的太相似了:


    导入合格数据。数字。素数为P

    fibs::[整数]
    fibs=0:1:zipWith(+)fibs(尾部fibs)

    smallestFibPrimeAfter::Integer->Integer
    smallestFibPrimeAfter lowBound=头部。dropWhile(\a->不是.P.isPrime$a)。过滤器(>lowBound)$fibs

    因子::Integer->[Integer]
    系数x=1:系数x 2
    哪里
    因子'nf|f>=(n`div`2)=[n]
    |n`mod`f==0=f:factors'(n`div`f)(f+1)
    |否则=系数n(f+1)

    主::IO()
    main=打印。显示。总和。因素。(+1)。227000美元后的最小FibPrime

  5. Axio公司

    ;; 问题的说明不完整。
    ;;你想要的是(唯一的)*prime*因子,而不是因子(除数)
    ;; 我将规范解读为(因子12)=>(1 2 3 4 6 12)
    ;; 而你所期望的(因子12)=>(23)
    ;; 关于这个问题,所举的例子毫无帮助
    ;; 因为14是两个素数的乘积。

    ;; 尾部递归
    (define(fib n#!可选(g 0)(d 1))
    (如果(=0 n)

    (fib(-n 1)d(+g d))

    ;; 不包括1和自己
    ;; 很天真,但不完全
    (定义(系数n)
    (出租(tmax(楼层(平方米)))
    (let循环((i 2))
    (如果(>i tmax)
            ‘()
    (如果(零?(模n i))
    (cons i(cons(商n i)(循环(+i 1)))
    (回路(+i 1)))

    ;; 效率低下,因为我们已经完成了大部分计算
    (定义(质数?n)
    (and(not(=1 n))(null?(因子n)))

    (定义(运行n)
    (let循环((i 2))
    (让(f(fib i))
    (如果(>=f n)
    (如果(null?(因子f));;首要的
    (应用+(过滤素数?(系数(+1 f)))
    (循环(+i 1))
    (回路(+i 1)))

    (运行227000);;=>352

  6. Khanh Nguyen先生
    开放式系统let除数(n:int)=[设x=float n/2.0 |>int对于2…x do中的i如果n%i=0,则产生i]设isPrime(n:int)=列表长度(除数n)=0let fib_primes(n:int)=让smallest_fib=让rec fin_fibs a b=如果是Prime a&&a>n,则为其他的fin_fibs b(a+b)财务_财务报表1 1(smallest_fib+1)|>除数|>List.filter(fun x->isPrime x)|>List.sumfib _价格227000
  7. 斯瓦拉(swaraj)

    红宝石溶液(http://codepad.org/zOatd6NO)

  8. 达纳吉

    用于bigints的Perl版本。例如。

    perl greplin2.pl 227000号使用F(29)=514229因子总和:352perl greplin2.pl 20000000000000000000000000000000000000000000.000000000000000000000使用F(449)=30617199924845450305543138480837172081112854323537384971316747993215712381490159334428056649因子总和:4966336310425739390388368472890698620

    我重复使用了我为并行斐波那契素数查找器编写的一些位。Fn优化很有趣,但在这里没有那么有用。对于此代码,fib生成器可能更简单。您需要安装Math::Prime::Util::GMP模块,以使bigint因子分解以合理的速度工作(或使用Math::Pari)。数学::Primality和数学::Pari可以用于素性测试。

    #!/usr/bin/env-perl严格使用;使用警告;使用数学::BigInt;使用数学::Prime::Util“:all”;使用列表::Util qw/sum/;我的$n=$ARGV[0]||227000;我的@fibstate;我的$F;我的$fn=0;做{#当n>4时,所有素数F(n)都有n个素数。适用于非常大的n。$fn=($fn<=4)$fn+1:下一个素数($fn);$F=fib_n($fn,\@fibstate);}while($F<=$n||!is_prime($F));打印“使用F($fn)=$F\n”;打印“因子总和:”,总和(因子($F+1)),“\n”;子fib_n{my($n,$fibstate)=@_;@$fibstate=(1,数学::BigInt->new(0),数学::BigInt->new(1))除非定义$fibstate->[0];my($curn,$a,$b)=@$fibstate;如果$n<$curn,则die“fibn仅增加”;do{($a,$b)=($b,$a+$b);}表示(1..$n-$curn);@$fibstate=($n,$a,$b);亿美元;}

留下评论