寻找前N个连续的合数

4
以下代码保证返回连续的 N 个合数:
(N+1)!+2,(N+1)!+3........(N+1)!+(N+1) 

我使用以下代码在R中找到了5个连续的合数:

N=5
for(i in 2:6){a=factorial(N+1)+i;print(a);}
# [1] 722
# [1] 723
# [1] 724
# [1] 725
# [1] 726

然而,我需要前 N 个连续的复合数,但这段代码不能保证返回这样的结果。例如,对于 N=5,我想要 24,25,26,27,28


你是否在寻找 factorial(N-1)+seq_len(N)-1 - nicola
1
你们如何验证这些数字全部都是合数呢? - David Arenburg
@nicola 这个命令对于N=5是正确的,但是对于N=4没有用。因为我得到了6 7 8 9。这里7不是一个合数。 - Aarthika
2
我真的不理解给定输入的预期输出逻辑... - Tensibai
1
“numbers”包含“Primes”函数,可以生成质数。然后,您可以轻松地找到第一个“N”个合成数序列(如果这是您要查找的内容)。 - nicola
可能是 http://stackoverflow.com/questions/32397169/how-to-find-consecutive-composite-numbers-in-r/32397742#32397742 的重复问题。 - Maksim Gayduk
1个回答

4

您可以使用numbers:::Primesnumbers:::primeSieve(感谢@Nicola在评论中提到此函数!)生成质数列表,使用diff计算它们之间的差值,然后使用seq从第一个差值至少为N的质数开始返回一个序列:

library(numbers)
primes <- as.integer(numbers:::primeSieve(100000000))  # About 9 seconds
d <- diff(primes)
firstNComposite <- function(N) {
  valid <- which(d >= N+1)
  if (length(valid) == 0) {
    stop("Need to generate more prime numbers")
  } else {
    seq(primes[valid[1]]+1, length.out=N)
  }
}
firstNComposite(5)
# [1] 24 25 26 27 28
firstNComposite(200)
#   [1] 20831324 20831325 20831326 20831327 20831328 20831329 20831330 20831331 20831332 20831333 20831334
#  [12] 20831335 20831336 20831337 20831338 20831339 20831340 20831341 20831342 20831343 20831344 20831345
#  [23] 20831346 20831347 20831348 20831349 20831350 20831351 20831352 20831353 20831354 20831355 20831356
#  [34] 20831357 20831358 20831359 20831360 20831361 20831362 20831363 20831364 20831365 20831366 20831367
#  [45] 20831368 20831369 20831370 20831371 20831372 20831373 20831374 20831375 20831376 20831377 20831378
#  [56] 20831379 20831380 20831381 20831382 20831383 20831384 20831385 20831386 20831387 20831388 20831389
#  [67] 20831390 20831391 20831392 20831393 20831394 20831395 20831396 20831397 20831398 20831399 20831400
#  [78] 20831401 20831402 20831403 20831404 20831405 20831406 20831407 20831408 20831409 20831410 20831411
#  [89] 20831412 20831413 20831414 20831415 20831416 20831417 20831418 20831419 20831420 20831421 20831422
# [100] 20831423 20831424 20831425 20831426 20831427 20831428 20831429 20831430 20831431 20831432 20831433
# [111] 20831434 20831435 20831436 20831437 20831438 20831439 20831440 20831441 20831442 20831443 20831444
# [122] 20831445 20831446 20831447 20831448 20831449 20831450 20831451 20831452 20831453 20831454 20831455
# [133] 20831456 20831457 20831458 20831459 20831460 20831461 20831462 20831463 20831464 20831465 20831466
# [144] 20831467 20831468 20831469 20831470 20831471 20831472 20831473 20831474 20831475 20831476 20831477
# [155] 20831478 20831479 20831480 20831481 20831482 20831483 20831484 20831485 20831486 20831487 20831488
# [166] 20831489 20831490 20831491 20831492 20831493 20831494 20831495 20831496 20831497 20831498 20831499
# [177] 20831500 20831501 20831502 20831503 20831504 20831505 20831506 20831507 20831508 20831509 20831510
# [188] 20831511 20831512 20831513 20831514 20831515 20831516 20831517 20831518 20831519 20831520 20831521
# [199] 20831522 20831523

如果我想要更多的东西,我该怎么办?我收到了“无法分配大小为3.7 Gb的向量”这样的错误。 - Aarthika
@Aarthika,您需要使用一种不同的(更节省内存的)质数生成实现,而不是numbers:::primeSieve - josliber
@Aarthika 如果你向 numbers:::primeSieve 传递了太大的参数,那么你的计算机将会耗尽内存。唯一的解决方法是找到一种新的生成质数的方式或购买更多的内存。你试图解决多大的问题? - josliber
好的...我需要至少firstNComposite(500)。新的生成质数的方法意味着我需要找到不同的命令吗? - Aarthika
@Aarthika你需要找一个新的命令--抱歉。我特别建议寻找分段埃拉托色尼筛法的实现,因为它使用的内存比非分段形式少。不幸的是,我不知道任何R语言中这样的实现,并且在这个网站上询问库的建议是不相关的。您可以尝试在http://softwarerecs.stackexchange.com/上寻求分段筛法实现的软件建议。但是,请确保先阅读他们的[发布指南](http://softwarerecs.stackexchange.com/help/on-topic)。 - josliber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接