#!/bin/bash # Teal Dulcet # Factor programs testing and benchmarking script. # Run: time ./test.sh > test-results.out 2>&1 & # Instructions for building GNU Coreutils: https://github.com/tdulcet/Numbers-Tool/#build-gnu-coreutils # Instructions for building uutils coreutils: https://github.com/tdulcet/Numbers-Tool/#build-uutils-coreutils # set -e if [[ $# -ne 0 ]]; then echo "Usage: time $0" >&2 exit 1 fi # Programs to test programs=( factor ./factor ./uu-factor ) # Adapted from: https://github.com/coreutils/coreutils/blob/master/tests/factor/create-test.sh # prefix of 2^64 p=184467440737 # prefix of 2^96 q=79228162514264337593543 # Each of these numbers has a Pollard rho factor larger than 2^64, # and thus exercises some hard-to-reach code in factor.c. t1=170141183460469225450570946617781744489 t2=170141183460469229545748130981302223887 # -- # https://en.wikipedia.org/wiki/Mersenne_prime#List_of_known_Mersenne_primes and https://www.mersenne.org/primes/ primes=( 3 7 31 127 8191 131071 524287 2147483647 2305843009213693951 618970019642690137449562111 162259276829213363391578010288127 170141183460469231731687303715884105727 6864797660130609714981900799081393217269435300143305409394463459185543183397656052122559640661454554977296311391480858037121987999716643812574028291115057151 ) # 2^63 - 1, 2^64 - 1, 2^127 - 1, 2^128 - 1, 2^255 - 1, 2^256 - 1 numbers=( 9223372036854775807 18446744073709551615 170141183460469231731687303715884105727 340282366920938463463374607431768211455 57896044618658097711785492504343953926634992332820282019728792003956564819967 115792089237316195423570985008687907853269984665640564039457584007913129639935 ) for i in "${programs[@]}"; do if ! command -v "$i" >/dev/null; then echo "Error: \"$i\" program is not found." >&2 exit 1 fi done # Factor numbers # test1 ... test1() { for i in "${programs[@]}"; do echo -e "\n$i $*" for j in {1..5}; do echo -e "\n\t$j" time "$i" "$@" done echo done } # Factor number range # test2 test2() { for i in "${programs[@]}"; do echo -e "\n$i $1 .. $2" for j in {1..5}; do echo -e "\n\t$j" # time { seq "$1" "$2" | "$1" 2>&1 | md5sum; } time { seq "$1" "$2" | "$i" 2>&1 | sha256sum; } done echo done } # set -x test1 "${primes[@]}" test1 "${numbers[@]}" test1 "$t1" "$t2" # 100000000 # test2 0 90000000 test2 0 $(( 10 ** 8 )) # 268435456 # test2 0 $(( 2 ** 28 )) # 1000000 # test2 $(bc <<< '(2^64) - (10^6) - 1') $(bc <<< '(2^64) - 1') test2 18446744073708551615 18446744073709551615 # 1499999 test2 ${p}08551616 ${p}10051615 # 21999 test2 ${q}940336 ${q}962335