Skip to content

Latest commit

 

History

History
34 lines (24 loc) · 1.55 KB

readme.md

File metadata and controls

34 lines (24 loc) · 1.55 KB
const permute = require('@lancejpollard/quadratic-residue-prng.js')

const E = 3132343537383103113163n
const A = 975319753197531975319n
const O = 541613713n
const U = 32 ** 15

let i = 0
while (i < U) {
  const x = permute(i, E, A, O, U)
  console.log(x)
  i++
}
  • E, A, and O must be primes smaller than U, with E the largest, A the second largest, and O relatively small.
  • E should probably be the largest prime that is less than U.
  • U can be any bigint.
  • All numbers must be bigint.
  • i is an incrementing bigint

Select some primes from the primes folder based on your U (max). Vary A between sequences to create highly different sequences out of the incrementing sequence.

So for example, you want to generate 3 sets of pseudo random IDs, you're going to need 3 different sequences (output), but can use the same range of input sequences (0 to max U). Pick a unique A for each sequence, but fix E, O, and U. Then when you input i, you will get different values for each sequence at index i. Sometimes you might want to change U to be a different max, to limit the range (and size) of possible values, as well. But if U is constant, to generate different sequences, vary A on a per-sequence basis.

The math behind this is pure magic. Whoever figured this out, please explain lol.

This only works for primes E which satisfy E ≡ 3 mod 4 (prime % 4 === 3).

Some key primes that are p % 4 === 3 are in the primes folder in this repo.