Ormiston triples

Revision as of 13:16, 2 February 2023 by PureFox (talk | contribs) (Created a new draft task and added a Wren example)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

An Ormiston triple is three consecutive prime numbers which are anagrams, i.e. contain the same decimal digits but in a different order.

Ormiston triples is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Definition
Example

The three consecutive primes (11117123, 11117213, 11117321) are an Ormiston triple.

Task
  • Find and show the smallest member of the first 25 Ormiston triples.
  • Find and show the count of Ormiston triples up to one billion.
Stretch
  • Find and show the count of Ormiston triples up to ten billion.
Reference
Related task


Wren

Library: Wren-math
Library: Wren-fmt

This uses a segmented sieve to get up to 10 billion without running out of memory (bools in Wren require 8 bytes rather than one) and takes just over 13 minutes to achieve the stretch goal.

Limiting the search to a billion, takes about 73 seconds (68 seconds using our 'standard' sieve).

import "./math" for Int
import "./fmt" for Fmt

var limit = 1e10
var primes = Int.segmentedSieve(limit, 8)
var orm25 = []
var j = 1e9
var count = 0
var counts = []
for (i in 0...primes.count-2) {
    var p1 = primes[i]
    var p2 = primes[i+1]
    var p3 = primes[i+2]
    if ((p2 - p1) % 18 != 0 || (p3 - p2) % 18 != 0) continue
    var key1 = 1
    for (dig in Int.digits(p1)) key1 = key1 * primes[dig]
    var key2 = 1
    for (dig in Int.digits(p2)) key2 = key2 * primes[dig]
    if (key1 != key2) continue
    var key3 = 1
    for (dig in Int.digits(p3)) key3 = key3 * primes[dig]
    if (key2 == key3) {
        if (count < 25) orm25.add(p1)
        if (p1 >= j) {
            counts.add(count)
            j = j * 10
        }
        count = count + 1
    }
}
counts.add(count)
System.print("First 25 Ormiston prime triples:")
Fmt.tprint("$,10d ", orm25, 5)
System.print()
j = 1e9
for (i in 0...counts.count) {
    Fmt.print("$,d Ormiston prime triples before $,d",  counts[i], j)
    j = j * 10
    System.print()
}
Output:
First 25 Ormiston prime triples:
11,117,123  12,980,783  14,964,017  32,638,213  32,964,341  
33,539,783  35,868,013  44,058,013  46,103,237  48,015,013  
50,324,237  52,402,783  58,005,239  60,601,237  61,395,239  
74,699,789  76,012,879  78,163,123  80,905,879  81,966,341  
82,324,237  82,523,017  83,279,783  86,050,781  92,514,341  

368 Ormiston prime triples before 1,000,000,000

4,925 Ormiston prime triples before 10,000,000,000