RosettaCodeData/Task/Successive-prime-differences/Nim/successive-prime-differences.nim
2023-07-01 13:44:08 -04:00

50 lines
1.4 KiB
Nim
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import math, strutils
const N = 1_000_000
var comp: array[2..(N - 1), bool] # True is composite, so default is prime.
for n in 2..<N:
if not comp[n]:
for k in countup(n * n, N - 1, n):
comp[k] = true
var primes = @[2]
for n in countup(3, N - 1, 2):
if not comp[n]:
primes.add n
iterator groups(primes: seq[int]; diffs: varargs[int]): seq[int] =
## Yield groups of successive primes with given differences.
var cumdiffs = cumsummed(diffs) # Compute differences from first prime of group.
let groupSize = diffs.len + 1
for i in 0..(primes.len - groupSize):
let p = primes[i]
var group = @[p]
for k, diff in cumdiffs:
if primes[i + k + 1] != p + diff: break
group.add p + diff
if group.len == groupSize:
yield group
proc findGroups(primes: seq[int]; diffs: varargs[int]) =
## In the given list of primes and for the given differences,
## find the first group, the last group and the count of groups.
var
first, last: seq[int]
count = 0
for group in primes.groups(diffs):
if first.len == 0: first = group
last = group
inc count
echo "Differences: ", diffs.join(", ")
echo " first: ($#)" % first.join(", ")
echo " last: ($#)" % last.join(", ")
echo " count: ", count
echo()
primes.findGroups(2)
primes.findGroups(1)
primes.findGroups(2, 2)
primes.findGroups(2, 4)
primes.findGroups(4, 2)
primes.findGroups(6, 4, 2)