How to resolve the algorithm Successive prime differences step by step in the jq programming language

Published on 12 May 2024 09:40 PM
#Jq

How to resolve the algorithm Successive prime differences step by step in the jq programming language

Table of Contents

Problem Statement

The series of increasing prime numbers begins: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, ... The task applies a filter to the series returning groups of successive primes, (s'primes), that differ from the next by a given value or values. Example 1: Specifying that the difference between s'primes be 2 leads to the groups: (Known as Twin primes or Prime pairs) Example 2: Specifying more than one difference between s'primes leads to groups of size one greater than the number of differences. Differences of 2, 4 leads to the groups: In the first group 7 is two more than 5 and 11 is four more than 7; as well as 5, 7, and 11 being successive primes. Differences are checked in the order of the values given, (differences of 4, 2 would give different groups entirely). Note: Generation of a list of primes is a secondary aspect of the task. Use of a built in function, well known library, or importing/use of prime generators from other Rosetta Code tasks is encouraged.

Let's start with the solution:

Step by Step solution about How to resolve the algorithm Successive prime differences step by step in the jq programming language

Source code in the jq programming language

# Emit a stream of consecutive primes.
# The stream is unbounded if . is null or infinite,
# otherwise it continues up to but excluding `.`.
def primes:
  (if . == null then infinite else . end) as $n
  | 2, (range(3; $n; 2) | select(is_prime));

# s is a stream
# $deltas is an array
# Output: a stream of arrays, each corresponding to a selection of consecutive
# items from s satisfying the differences requirement.
def filter_differences(s; $deltas):

  def diffs_equal: # i.e. equal to $deltas
    . as $in
    | all( range(1;length);
           ($in[.] - $in[.-1]) == $deltas[. - 1]);

  ($deltas|length + 1) as $n
  | foreach s as $x ( {};
      .emit = null
      | .tuple += [$x]
      | .tuple |= .[-$n:]
      | if (.tuple|length) == $n
        then if (.tuple|diffs_equal) then .emit = .tuple
             else .
	     end
	else .
	end;
      select(.emit).emit );

def report_first_last_count(s):
  null | {first,last,count}
  | reduce s as $x (.;
      if .first == null then .first = $x else . end
      | .count = .count + 1
      | .last = $x ) ;

[pow(10;6) | primes] as $p1e6
| ([2], [1], [2,2], [2,4], [4,2], [6,4,2]) as $d
| ("\nFor deltas = \($d):", report_first_last_count(filter_differences($p1e6[]; $d ) ) )

  

You may also check:How to resolve the algorithm 100 doors step by step in the Glee programming language
You may also check:How to resolve the algorithm Associative array/Iteration step by step in the Frink programming language
You may also check:How to resolve the algorithm Scope modifiers step by step in the Déjà Vu programming language
You may also check:How to resolve the algorithm Bitcoin/public point to address step by step in the Python programming language
You may also check:How to resolve the algorithm Self-describing numbers step by step in the C programming language