From fec52b177f9babd0db2d0691a708a11af9269adc Mon Sep 17 00:00:00 2001 From: Mia Date: Fri, 29 Oct 2021 13:59:05 -0400 Subject: [PATCH] wip LCG algo --- README | 3 +++ README.md | 3 --- ran | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 README delete mode 100644 README.md create mode 100644 ran diff --git a/README b/README new file mode 100644 index 0000000..6244f32 --- /dev/null +++ b/README @@ -0,0 +1,3 @@ +---- +# psh-prng +-- an attempt at pure POSIX sh random number generation \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 584b299..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# psh-prng - -an attempt at pure POSIX sh random number generation \ No newline at end of file diff --git a/ran b/ran new file mode 100644 index 0000000..5ef8071 --- /dev/null +++ b/ran @@ -0,0 +1,54 @@ +#!/bin/sh +[ -c /dev/urandom ] && { + read -r seed < /dev/urandom # read a single line of urandom + seed=${#seed} +} || { # otherwise generate a seed by counting stuff + n=0; + [ -x /bin/ ] && { # if we can access /bin count the files in it + for i in /bin/*; do + [ -f "$i" ] && : $((n+=1)) + done + } + [ -x /tmp/ ] && { + for i in /tmp/*; do + [ -e "$i" ] && : $((n+=1)) + done + } + [ -x /var/ ] && { + for i in /var/*; do + [ -e "$i" ] && : $((n+=1)) + done + } + : $((n+=${#PWD})); : $((n+=${#0})) + seed="${n:-100}" +} +# $seed should now contain a number +for i in 1 2 3 4 5; do # 5 times + [ ! "$((seed*seed))" -gt "$seed" ] && break # break if we have reached a max length num + seed=$((seed*seed)) + seed="${seed#?}"; seed="${seed%?}" # use the middle-square method to generate a new seed +done +# LCG imp follows +# generate a modulus (m) from the length of $seed and then detemine if its a prime +m="${#seed}"; [ "$((m%2))" -eq 0 -o "$((m%3))" -eq 0 ] || : $((m+=1)) # if prime +# ^ if not a multiple of 2 or 3 expect the number to be prime and increase it by 1 +p=0 # $p is the next prime and can be determined using a while loop that adds 1 to it until it becomes a prime +if [ "$((m%2))" -eq 0 ]; then # now determine the prime factors of $m + f=$((m/2)) # next prime is 3; 5 + p=3 # we know the next prime + until [ ! "$((f%2))" -eq 0 -a ! "$((f%3))" -eq 0 ]; do + f=$((f/p)) + : $((p+=1)); until [ ! "$((p%2))" -eq 0 -a ! "$((p%3))" -eq 0 ]; do + : $((P+=1)) + done + done +elif [ "$((m%3))" -eq 0 ]; then + f=$((m/3)) # next prime is 5; 7 + p=5 + until [ ! "$((f%2))" -eq 0 -a ! "$((f%3))" -eq 0 ]; do + f=$((f/p)) + : $((p+=1)); until [ ! "$((p%2))" -eq 0 -a ! "$((p%3))" -eq 0 ]; do + : $((p+=1)) + done + done # until $f is prime do the above +fi # $f is the prime factor of $m \ No newline at end of file