【问题标题】:Finding first N consecutive composite numbers查找前 N 个连续的合数
【发布时间】:2015-12-06 16:34:51
【问题描述】:

以下保证返回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 这个命令对 N=5 是正确的,但是 N=4 这没有用。因为我得到了 6 7 8 9。这里 7 不是合数。
  • 我真的没有得到给定输入的预期输出的逻辑......
  • numbers 包具有Primes 函数,可让您生成素数。然后,您可以轻松找到第一个N 合数序列(如果您正在寻找的话)。

标签: r primes composite number-theory


【解决方案1】:

您可以使用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 您需要使用不同于numbers:::primeSieve 的素数生成实现(内存效率更高)。
  • @Aarthika 如果您将太大的参数传递给numbers:::primeSieve,那么您的计算机将耗尽内存。解决这个问题的唯一方法是找到一种新的方法来生成素数或购买更多的内存。您要解决多大的问题?
  • 好的...我需要至少第一个 NComposite(500)。生成素数的新方法意味着我必须找到不同的命令吗?
  • @Aarthika 你需要找到一个新命令——抱歉。我会特别寻找埃拉托色尼筛的分段形式的实现,因为它比非分段形式使用更少的内存。不幸的是,我不知道 R 中有任何这样的实现,并且在这个站点上询问库建议是题外话。您可以尝试在softwarerecs.stackexchange.com 上询问有关实施分段筛的软件建议。不过,请务必先阅读他们的posting guidelines
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多