'begin the teaprime.tea program written in the 
'programming language Teapro utilizing the OpenTea technology
'In today's world, we need computer software that actually works.
vari dg_pass1, dg_pass2, dg_pass3, dg_pass4
vari sg_pass1, sg_pass2, sg_pass3, sg_pass4
vari dg_now, sg_now, dg_endprogram
vari dg_length, sg_primequads, sg_fileout
vari sg_build, sg_math, sg_nothing
vari dg_xvalue, dg_yvalue, dg_zvalue, sg_xyzmath

sub_main
endp

subr sub_main
'updated 2005/10/21, 2004/03/30
'main subroutine
    vari d_any, s_any, d_dot, s_dot
    vari d_pick

    dg_endprogram = 2

    dwhi dg_endprogram <> 1
	  sub_menu0
    endw
ends sub_main


subr sub_menu0
'updated 2009/03/08, 2008/12/06, 2008/02/25, 2008/02/05
'2007/12/05, 2007/09/22, 2007/07/24, 2007/07/20, 2007/07/18
'2007/07/17, 2007/07/16, 2007/06/27, 2007/06/26, 2007/04/24
'2007/02/26, 2007/02/25, 2007/02/24, 2007/01/06, 2006/11/26
'2006/11/11, 2006/11/05, 2006/10/29, 2006/10/25, 2006/08/29
'2006/08/17, 2006/04/08, 2005/10/21, 2005/10/19, 2004/04/17
'menu of possibilities
    vari d_any, s_any, d_dot, s_dot, s_aster
    vari s_pick, d_pick, s_out, d_inp, d_seconds

    $trb sg_nothing, " "
    $ch$ s_aster, "*", 70

    sg_build = "Program: teaprime.tea, build=689, 2009/06/17"
    $out sg_build
    $out "Copyright 1998-2009 D La Pierre Ballard"

    $out "Written in the Teapro programming language"
    $out "1998-2009 by D La Pierre Ballard"

    $out "teaprime.tea may be used for free by anyone,"
    $out "but there is no warranty of any kind on it."

    $out s_aster
    $out "Teapro uses the OpenTea technology to be simple and solid."

    $out s_aster
        
    s_any = "In today's world, we need computer software "
    $app s_any, " that actually works."
    $out s_any
    $out s_aster

    sub_floating_point_test
    sub_filename
    sub_path_prog_memory
    sub_speedquick    
    $out s_aster

    $out "1 = duo teaquad 5TP39 begin again, 1quad"
    $out "2 = duo teaquad 5TP39 choose file code and number"
    $out "5 = teaquad 5TP39 choose file code and number"
    $out "11 = sub_menu_5tp39"
    $out "12 = sub_menu_pnq30"
    $out "13 = sub_menu_primes"
    $out "21 = sub_teaquad_primes_1101"
    $out "31 = sub_prime_numbers"
    $out "32 = sub_compare_dfac_and_dfak"
    $out "33 = sub_teaquad_prime_quads_duo"
    $out "35 = sub_teaquad_5tp39_teapro_loop"
    $out "42 = sub_prime_test_one_number"
    $out "44 = sub_teaquad_primes_find"
    $out "45 = sub_teaquad_primes_test_one_number"
    $out "46 = sub_teaquad_primes_test_in_file"
    $out "47 = sub_teaquad_5tp39_test_a_number_duo"
    $out "49 = sub_teaquad_mod_test"
    $out "51 = sub_collect_5tp39xx"
    $out "96 = sub_xyz_math"
    $out "97 = sub_teaquad_prime_duo_speed_test"
    $out "98 = sub_speed98_test"
    $out "99 = sub_speed_test " + dg_pass1

    dsec d_any
    s_out = "pick a number *=end " + " x=" + dg_xvalue
    $app s_out, " " + d_any
    $inp s_pick, s_out

    $isd d_any, s_pick
    d_pick = 0
    dift d_any = 1: $tod d_pick, s_pick

    $ift s_pick = "*": dg_endprogram = 1

    '5tp39 find by modulus begin again 1quad
    dift d_pick = 1
	  dg_pass1 = 1
	  sub_teaquad_5tp39_by_modulus_duo
    endi

    '5tp39 find by modulus choose file code, beg, end
    dift d_pick = 2
	  dg_pass1 = 2
	  sub_teaquad_5tp39_by_modulus_duo
    endi

    'menu for 5TP39
    dift d_pick = 11: sub_menu_5tp39

    'menu for PNQ30
    dift d_pick = 12: sub_menu_pnq30

    'sub_menu_primes
    dift d_pick = 13: sub_menu_primes

    'primes of the form of 101
    dift d_pick = 21: sub_teaquad_primes_1101

    'Primes
    dift d_pick = 31: sub_prime_numbers

    'almost primes
    dift d_pick = 32: sub_compare_dfac_and_dfak

    'Prime number quads
    dift d_pick = 33: sub_teaquad_prime_quads_duo

    'test 5tp39 with teapro loop
    dift d_pick = 35: sub_teaquad_5tp39_teapro_loop

    'prime number, test a particular number
    dift d_pick = 42: sub_prime_test_one_number

    'teaquad primes > 2^53
    dift d_pick = 44: sub_teaquad_primes_find
    dift d_pick = 45: sub_teaquad_primes_test_one_number
    dift d_pick = 46: sub_teaquad_primes_test_in_file
    dift d_pick = 47: sub_teaquad_5tp39_test_a_number_duo
    dift d_pick = 49: sub_teaquad_mod_test

    dift d_pick =51: sub_collect_5tp39xx

    dift d_pick = 96
	  sg_pass1 = "x=x"
	  sub_xyz_math
    endi
    dift d_pick = 97: sub_teaquad_prime_duo_speed_test
    dift d_pick = 98: sub_speed98_test
    dift d_pick = 99: sub_speed_test

    sg_pass1 = s_pick
    sub_xyz_math
ends sub_menu0


subr sub_menu_5tp39
'updated 2008/04/07, 2007/08/30, 2007/07/31
'2007/07/06, 2007/06/13, 2007/04/06, 2007/03/19, 2007/02/25
'2006/10/26, 2006/09/23, 2006/09/04, 2005/10/21, 2004/05/06
'menu of possibilities
    vari d_any, s_any, d_dot, s_dot
    vari s_pick, d_pick, s_out, d_inp, d_seconds

    $out "3 = sub_5tp39_find_simple_slow"
    $out "12 = sub_5TP39_validate_in_a_file"
    $out "13 = sub_5tp39_two_files_compare"
    $out "21 = sub_5tp39_clusters"
    $out "31 = sub_getgaps_begin_again"
    $out "41 = sub_teaquad_5tp39_find_simple_slow"
    $out "42 = sub_teaquad_5tp39_analyze_an_a_file"
    $out "52 = sub_5tp39_rolling_test_primes"
    $out "62 = sub_test_primes31_to_teaquad"
    $out "63 = sub_file_primes31_to_teaquad"
    s_out = "enter number,*=end, x=" + dg_xvalue
    $inp s_pick, s_out

    $isd d_any, s_pick
    d_pick = 0
    dift d_any = 1: $tod d_pick, s_pick

    $ift s_pick = "*": dg_endprogram = 1

    '5tp39 find simple
    dift d_pick = 3: sub_5tp39_find_simple_slow

    'test 5TP39 primes marked 5TP39= in a file
    dift d_pick = 12: sub_5TP39_validate_in_a_file

    'compare two files for 5TP39
    dift d_pick = 13: sub_5tp39_two_files_compare

    '5TP39 clusters from the file
    dift d_pick = 21: sub_5tp39_clusters

    dift d_pick = 31: sub_getgaps_begin_again    
    dift d_pick = 41: sub_teaquad_5tp39_find_simple_slow
    dift d_pick = 42: sub_teaquad_5tp39_analyze_an_a_file
    dift d_pick = 52: sub_5tp39_rolling_test_primes
    dift d_pick = 62: sub_test_primes31_to_teaquad
    dift d_pick = 63: sub_file_primes31_to_teaquad

    sg_pass1 = s_pick
    sub_xyz_math
ends sub_menu_5tp39


subr sub_menu_pnq30
'updated 2005/10/22, 2004/01/01
'menu of possibilities
    vari d_any, s_any, d_dot, s_dot
    vari s_pick, d_pick, s_out, d_inp, d_seconds

    $out "34 = big PNQ30s"
    $out "35 = PNQ30 by jumping 210"
    $out "36 = PNQ30 by PIVCOM"
    $out "37 = PNQ30 by Modulus, begin anywhere"
    $out "38 = PNQ30 by Modulus, begin again"
    $out "41 = test a number for PNQ30"
    $out "51 = test PNQ30s marked 'PNQ30=' or 'PNQ30:' in a file"
    
    s_out = "enter number,*=end, x=" + dg_xvalue
    $inp s_pick, s_out

    $isd d_any, s_pick
    d_pick = 0
    dift d_any = 1: $tod d_pick, s_pick

    $ift s_pick = "*": dg_endprogram = 1

    'big prime quads thirty apart
    dift d_pick = 34: sub_big_pnq30s

    'find PNQ30 by jumping 210
    dift d_pick = 35: sub_pnq30_by_210

    'find PNQ30 by PIVCOM
    dift d_pick = 36: sub_pnq30_by_pivcom

    'find PNQ30 by modulus
    dift d_pick = 37
	  dg_pass1 = 1
	  sub_pnq30_by_modulus
    endi

    'find PNQ30 by modulus begin anywhere
    dift d_pick = 38
	  dg_pass1 = 2
	  sub_pnq30_by_modulus
    endi

    'test a prime number for PNQ30
    dift d_pick = 41: sub_test_for_pnq30

    'test PNQ30 primes marked PNQ30= in a file
    dift d_pick = 51: sub_pnq30_file_test

    sg_pass1 = s_pick
    sub_xyz_math
ends sub_menu_pnq30


subr sub_menu_primes
'updated 2007/08/07, 2007/05/28, 2007/02/25, 2006/09/04
'2006/04/16, 2005/10/21, 2005/10/15, 2005/10/12, 2005/08/23
'2005/07/21, 2005/07/02, 2005/06/15, 2005/06/07, 2005/06/05
'2005/05/17, 2005/05/06, 2005/05/02, 2005/05/01, 2005/03/31
'2005/03/29, 2005/03/16, 2005/03/13, 2005/02/24, 2005/02/15
'2005/02/13, 2005/02/12, 2005/02/09, 2004/11/14
    vari s_any, d_any, s_dot, d_dot
    vari d_loop, s_pick, d_pick

    d_loop = 1
    dwhi d_loop = 1
        $out "2. prime numbers"
	  $out "4. prime gaps simple"
	  $out "5. prime gaps dfac"
	  $out "51. sub_dfac_speed_test"
	  $out "61. test every 10^14 number for times"
        $inp s_pick, "pick a number, * to end"

	  d_pick = 0
	  $isd d_any, s_pick
	  dift d_any = 1: $tod d_pick, s_pick

        'asterisk is char 42
        $ift s_pick = "*": d_loop = 2

        'prime numbers
        dift d_pick = 2: sub_primes_find

	  'prime gaps simple
	  dift d_pick = 4: sub_prime_gaps_simple

	  'prime gaps simple
	  dift d_pick = 5: sub_prime_gaps_dfac

        'dfac speed test
        dift d_pick = 51: sub_dfac_speed_test

        'test every 10^14th number for times
        dift d_pick = 61: sub_primes_time_test
    endw
ends sub_menu_primes


subr sub_primes_find
'updated 2006/07/29, 2005/03/31, 2005/02/17, 
'2005/02/13, 2005/02/12, 2005/02/11, 2005/02/09, 
'2005/02/05, 2005/01/31, 2005/01/30, 2004/12/04
'prime numbers
    vari s_any, d_any, s_dot, d_dot, s_out
    vari d_yesfile, s_filename, d_begin, d_tofindct,d_count
    vari d_time1, d_time2, d_time3
    vari d_maxdiff, d_maxprime, d_prevprime
    vari d_totprimes, d_yesdfac

    $sys s_any, 2
    $out s_any

    d_yesdfac = 2
    $inp s_any, "1 = use dfac"
    $ift s_any = "1": d_yesdfac = 1

    $inp s_any, "1 = save in file"

    d_yesfile = 2
    $isd d_any, s_any
    dift d_any = 1: $tod d_yesfile, s_any

    dift d_yesfile = 1
	  $inp s_filename, "enter filename"
	  fdel d_any,  s_filename
    endi

    $out "12345678901234567890"
    $inp s_any, "enter number to start with"

    d_begin = 1
    $isd d_any, s_any
    dift d_any = 1: $tod d_begin, s_any

    ded$ s_any, d_begin, 0, 0
    $out "number entered=" + s_any

    'make sure number is odd and an integer
    d_begin = d_begin \ 1
    d_any = d_begin % 2
    dift d_any = 0: d_begin = d_begin + 1

    ded$ s_any, d_begin, 0, 0
    $out "begin=" + s_any

    'test d_begin for primeness
    d_begin = d_begin - 2

    $inp s_any, "how many to find"

    d_tofindct = 10
    $isd d_any, s_any
    dift d_any = 1: $tod d_tofindct, s_any

    $out "number to find=" + d_tofindct

    'get the begin seconds in d_time1
    dsec d_time1
    d_time2 = d_time1

    'd_maxdiff is for max difference at prime d_maxprime
    d_maxdiff = 0
    d_maxprime = 0

    'd_prevprime is for previous prime
    d_prevprime = d_begin

    'd_totprimes is for totalling the primes
    d_totprimes = 0

    'd_count is for counting the primes
    d_count = 0

    'is count d_count still less than total wanted d_tofindct
    dwhi d_count < d_tofindct

        'test d_begin for primeness
        d_begin = d_begin + 2
	  $sho d_begin

	  dift d_yesdfac = 1
		dfac d_dot, d_begin
	  else
            'prime test, dg_pass1=1 means prime
	      dg_pass1 = d_begin
            sub_prime_test_simple
	      d_dot = dg_pass1
	  endi

        dift d_dot = 1
		'we have a prime
            'output of prime in d_begin and info
            'increment count d_count
            d_count = d_count + 1

	      'get seconds into d_time2, begin in d_time1
	      dsec d_any
	      d_time3 = d_any - d_time2
	      d_time2 = d_any

	      'find difference with previous in d_prevprime
	      d_any = d_begin - d_prevprime
	      dift d_any > d_maxdiff
		    dift d_prevprime > 0
		        d_maxdiff = d_any
		        d_maxprime = d_prevprime
		    endi
	      endi

	      ded$ s_any, d_begin, 0, 0

	      s_out = "count=" + d_count + ", prime=" + s_any
	      $app s_out, ", seconds=" + d_time3 
		$app s_out, ", diff=" + d_any

            $out s_out

		'do we save to file s_filename
		dift d_yesfile = 1
		    fapp d_any, s_filename, s_out
		    dbad d_any = 0
		endi

	      'save to d_time1 for previous prime
	      d_prevprime = d_begin


            'd_totprimes is for totalling the primes
            d_totprimes = d_totprimes + d_begin
        endi
    endw

    'begin seconds are in d_time1
    dsec d_any
    d_any = d_any - d_time1
    s_out = "seconds=" + d_any
    $out s_out

    'do we save to file s_filename
    dift d_yesfile = 1
        fapp d_any, s_filename, s_out
	  dbad d_any = 0
    endi

    'output maximum d_maxdiff at d_maxprime
    ded$ s_any, d_maxprime, 0, 0
    s_out = "max=" + d_maxdiff + ", at=" + s_any
    $out s_out

    'do we save to file s_filename
    dift d_yesfile = 1
        fapp d_any, s_filename, s_out
	  dbad d_any = 0
    endi

    ded$ s_any, d_totprimes, 0, 0
    s_out = "total of primes=" + s_any
    $out s_out

    'do we save to file s_filename
    dift d_yesfile = 1
        fapp d_any, s_filename, s_out
	  dbad d_any = 0
    endi

    $inp s_any, "done"
ends sub_primes_find


subr sub_prime_gaps_simple
'updated 2006/05/20, 2006/05/09, 2006/05/03, 2006/05/01, 2006/04/18
'2006/04/17, 2006/04/16, 2005/03/31, 2005/02/23, 2005/02/19
    vari s_any, d_any, s_dot, d_dot, s_out
    vari d_yesfile, s_filename, d_number, d_tofindct, d_count
    vari s_date, s_prevhour, d_prevhour, d_factor, d_yesdfac
    vari d_gap, d_maxgap, d_prevprime, d_pause, d_loop
    vari d_process, d_seconds1, d_seconds2, s_seconds

    $sys s_any, 2
    $out s_any

    d_process = 1
    dift d_process = 1
        $inp s_any, "1 = pause after each"
        $ift s_any = "*": dinc d_process
        d_pause = 2
        $isd d_any, s_any
        dift d_any = 1: $tod d_pause, s_any
    endi
    dift d_process = 1
        $out "12345678901234567890"
        $inp s_any, "enter number to start with"
        $ift s_any = "*": dinc d_process

        d_number = 3
        $isd d_any, s_any
        dift d_any = 1: $tod d_number, s_any
    endi
    dift d_process = 1
	  $inp s_any, "enter max gap so far"
	  $ift s_any = "*": dinc d_process

        d_maxgap = 2
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_maxgap, s_any
    endi
    dift d_process = 1
        ded$ s_any, d_number, 0, 0
        $out "number entered=" + s_any
        $out "begin gap=" + d_maxgap

        'make sure number is odd and an integer
        d_number = d_number \ 1
        d_any = d_number % 2
        dift d_any = 0: d_number = d_number + 1
        s_prevhour = "99"

        ded$ s_any, d_number, 0, 0
        $out "begin=" + s_any
        $out "gap=" + d_maxgap
        $out "d_yesdfac=" + d_yesdfac

        'd_prevprime is for previous prime
        d_prevprime = d_number
        d_number = d_number + 2
    endi

    'd_count is for counting the primes
    d_count = 0

    'is count d_count still less than total wanted d_tofindct
    dsec d_seconds1
    d_loop = d_process

    dwhi d_loop = 1
	  dg_pass1 = d_number
	  sub_prime_test_simple
	  d_factor = dg_pass1

	  dift d_factor = 1
		'd_number is prime
		$sho d_number

            'increment count d_count
            d_count = d_count + 1

	      'find difference with previous in d_prevprime
	      d_gap = d_number - d_prevprime

		dift d_gap >= d_maxgap
		    dsec d_seconds2
		    d_any = d_seconds2 - d_seconds1
		    dto$ s_seconds, d_any, 0, 3

		    d_maxgap = d_gap

	          ded$ s_any, d_prevprime, 0, 0
	          s_out = d_count + ". prime=" + s_any
		    $app s_out, ", gap=" + d_gap
		    $app s_out, ", max=" + d_maxgap
		    $app s_out, ", sec=" + s_seconds
                $out s_out

		    dift d_pause = 1
			  $inp s_any, "return, go=go, * to end"
			  $ift s_any = "*": d_loop = 2
			  $tup s_any, s_any
			  $ift s_any = "GO": dinc d_pause
		    endi
		    d_seconds1 = d_seconds2
		endi

	      'save to d_time1 for previous prime
	      d_prevprime = d_number
        endi

	  'next number to test
        d_number = d_number + 2
    endw
ends sub_prime_gaps_simple


subr sub_prime_gaps_dfac
'updated 2008/09/13, 2006/05/20, 2006/04/19, 2006/04/18
'2006/04/17, 2006/04/16, 2005/03/31, 2005/02/23, 2005/02/19
    vari s_any, d_any, s_dot, d_dot, s_out
    vari d_yesfile, s_filename1, s_filename2
    vari d_number, d_prevprime, d_factor
    vari s_date, s_prevhour, d_prevhourprime
    vari d_gap, d_maxgap, d_loop
    vari d_process, d_halfmax, d_big
    vari d_sec1, d_sec2, d_sec3

    $sys s_any, 2
    $out s_any

    d_big = 2
    d_process = 1
    dift d_process = 1
        $inp s_any, "1 = append to files GAPS1.TXT,GAPS2.TXT"
        $ift s_any = "*": dinc d_process

        d_yesfile = 2
        $isd d_any, s_any
        dift d_any = 1: $tod d_yesfile, s_any
	  s_filename1 = "gaps1.txt"
	  s_filename2 = "gaps2.txt"
    endi
    dift d_process = 1
'1,693,182,318,746,371 PRIME GAP AFTER THIS OF 1132
'FOUND 1999 BY Be Nyman
	  $out "first prime gap over 1000 found 1999 by Be Nyman"
	  $out "big=1,693,182,318,746,371"
        $out "12345678901234567890"
        $inp s_any, "enter number to start with"
        $ift s_any = "*": dinc d_process
	  $tup s_any, s_any
	  $ift s_any = "BIG"
		s_any = "1,693,182,318,746,371"
		d_big = 1
	  endi

        d_number = 3
        $isd d_any, s_any
        dift d_any = 1: $tod d_number, s_any
    endi
    dift d_process = 1
	  dift d_big <> 1
		$inp s_any, "enter max gap so far"
	  else
		s_any = "2"
	  endi
	  $ift s_any = "*": dinc d_process

        d_maxgap = 2
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_maxgap, s_any
    endi
    dift d_process = 1
        ded$ s_any, d_number, 0, 0
        $out "number entered=" + s_any
        $out "begin gap=" + d_maxgap

        'make sure number is odd and an integer
        d_number = d_number \ 1
        d_any = d_number % 2
        dift d_any = 0: d_number = d_number + 1
        s_prevhour = "99"

        ded$ s_any, d_number, 0, 0
        $out "begin=" + s_any
        $out "gap=" + d_maxgap
	  d_halfmax = d_maxgap \ 2

        'd_prevprime is for previous prime
        d_prevprime = d_number
    endi

    dsec d_sec1
    d_loop = d_process

    dwhi d_loop = 1
	  'next number to test
        d_number = d_number + 2

	  dfac d_factor, d_number
	  dwhi d_factor <> 1
	      'next number to test
            d_number = d_number + 2

	      dfac d_factor, d_number
	  endw

	  'd_number is prime

        'find difference with previous in d_prevprime
        d_gap = d_number - d_prevprime

	  dift d_gap >= d_maxgap
		dsec d_sec2
		d_sec3 = d_sec2 - d_sec1
		d_sec1 = d_sec2

	      $dat s_date
	      $cut s_date, s_date, 1, 20

	      d_maxgap = d_gap
		d_halfmax = d_maxgap \ 2

            ded$ s_any, d_prevprime, 0, 0

            s_out = "prime=" + s_any
	      $app s_out, " gap=" + d_gap
	      $app s_out, " max=" + d_maxgap
            $app s_out, " dat=" + s_date 
		$app s_out, " sec=" + d_sec3
            $out s_out

	      'do we save to file s_filename
	      dift d_yesfile = 1
	          fapp d_any, s_filename1, s_out
		    dbad d_any = 0

	          fapp d_any, s_filename2, s_out
		    dbad d_any = 0
	      endi
	  endi

        d_prevprime = d_number

        dift d_gap > d_halfmax
	      $sho d_number

            '12345678901234567890
            '23-FEB-2005 08:25:03
            $dat s_date
            $cut s_any, s_date, 13, 2

            $ift s_any <> s_prevhour
                s_prevhour = s_any

                $cut s_date, s_date, 1, 20

                d_dot = d_prevprime - d_prevhourprime
                ded$ s_dot, d_dot, 0, 0
                d_prevhourprime = d_prevprime

                ded$ s_any, d_prevprime, 0, 0

                s_out = s_any + " " + "max=" + d_maxgap
	          $app s_out, "  " + s_date + " " + s_dot

	          $out s_out

                'do we save to file s_filename
                dift d_yesfile = 1
                    fapp d_any, s_filename1, s_out
	              dbad d_any = 0
                endi
            endi
        endi
	  dift d_big = 1
		dinc d_loop
		$inp s_any, "done"
	  endi
    endw
ends sub_prime_gaps_dfac


subr sub_teaquad_5tp39_find_simple_slow
'updated 2006/11/12, 2006/10/29, 2006/10/27
'2006/10/26, 2006/09/04, 2005/03/31, 2005/02/25, 2005/02/18
'2005/02/17, 2005/02/10, 2005/02/09, 2004/11/29
'find 5tp39 with teaquad slow method
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_loop, s_number, d_process
    vari d_numteaquad, d_teaquadpart, d_teaquadmult
    vari d_mod1, d_mod2
    vari d_try, d_result, s_filename
    vari s_hour, s_dateline, d_beghour

    $sys s_any, 2
    $out s_any

    d_teaquadmult = 1

    dpow d_numteaquad, 10, 15

    d_process = 1
    dift d_process = 1
        $out "enter starting number"
        $inp s_number, "12345678901234567890123"
        $ift s_number = "*": d_process = 2
    endi
    dift d_process = 1
	  sg_pass1 = s_number
	  sub_teaquad_from_string
	  d_teaquadpart = dg_pass1
	  d_teaquadmult = dg_pass2
	  dift d_teaquadpart = 0: dinc d_process
    endi
    dift d_process = 1
        $inp s_filename, "enter output filename"
        $ift s_filename = "*": d_loop = 2
    endi
    dift d_process = 1
        'get a proper PIVCOM
        'PIVCOM named by Roger Hargrave in 2002
        'd_any = d_number \ 210 * 210
        'dift d_any < 210: d_any = d_any + 210

        'd_numteaquad % 210 = 180
        d_mod1 = d_teaquadpart % 210
        d_mod2 = d_numteaquad % 210 * d_teaquadmult
        d_dot = d_mod1 + d_mod2 % 210
        d_teaquadpart = d_teaquadpart - d_dot

	  'get to the first possible of a 5tp39
        d_teaquadpart = d_teaquadpart - 19

        dg_pass1 = d_teaquadpart
	  dg_pass2 = d_teaquadmult
        sub_teaquad_to_string
        s_number = sg_pass1
        $out "begin=" + s_number

        s_hour = "aa"
        d_beghour = d_teaquadpart
    endi
    d_loop = d_process
    dwhi d_loop = 1
	  'test d_teaquadpart for 5TP39

        'almost 5TP39=11,13,17,19,29,31,41,43,47,49
	  dfak d_result, d_teaquadpart, d_teaquadmult

	  dift d_result = 1
	      d_try = d_teaquadpart + 2
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
		dg_pass1 = d_teaquadpart
		dg_pass2 = d_teaquadmult
		sub_teaquad_to_string
		s_number = sg_pass1

		$dat s_dateline
		$cut s_dateline, s_dateline, 1, 20
		$sho s_number + " " + s_dateline

		$cut s_any, s_dateline, 13, 2
		$ift s_any <> s_hour
		    s_hour = s_any
		    d_any = d_teaquadpart - d_beghour
		    ded$ s_any, d_any, 0, 0
		    ded$ s_out, d_teaquadpart, 0, 0
		    $app s_out, " " + s_dateline + ", hr=" + s_any
		    $out s_out
		    fapp d_any, s_filename, s_out
		    dbad d_any = 0
		    d_beghour = d_teaquadpart
		endi
	      d_try = d_teaquadpart + 6
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 8
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 18
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 20
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 30
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 32
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 36
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      d_try = d_teaquadpart + 38
	      dfak d_result, d_try, d_teaquadmult
	  dift d_result = 1
	      $dat s_dot
		$cut s_dot, s_dot, 1, 20
		dg_pass1 = d_teaquadpart
		dg_pass2 = d_teaquadmult
		sub_teaquad_to_string
		s_number = sg_pass1
	      s_out = "] 000:5TP39= " + s_number + "  " + s_dot
		$out s_out
		fapp d_any, s_filename, s_out
		dbad d_any = 0
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi

	  d_teaquadpart = d_teaquadpart + 210
    endw

    $inp s_any, "return"
ends sub_teaquad_5tp39_find_simple_slow


subr sub_5tp39_find_simple_slow
'updated 2006/09/04, 2005/03/31, 2005/02/25, 2005/02/18
'2005/02/17, 2005/02/10, 2005/02/09, 2004/11/29
'find 5tp39
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_loop, d_number
    vari d_try, d_result, s_filename
    vari s_hour, s_dateline, d_beghour

    $sys s_any, 2
    $out s_any

    'd_loop is loop
    d_loop = 1

    $out "enter starting number"
    $inp s_any, "123456789012345678901"
    $ift s_any = "*": d_loop = 2

    d_number = 1
    $isd d_any, s_any
    dift d_any = 1: $tod d_number, s_any

    $inp s_filename, "enter output filename"
    $ift s_filename = "*": d_loop = 2

    'get a proper PIVCOM
    'PIVCOM named by Roger Hargrave in 2002
    d_any = d_number \ 210 * 210
    dift d_any < 210: d_any = d_any + 210

    'get a proper beginning number for 5TP39
    d_number = d_any - 19

    ded$ s_any, d_number, 0, 0
    $out "begin=" + s_any

    s_hour = "aa"
    d_beghour = d_number

    dwhi d_loop = 1
	  'test d_number for 5TP39

        'almost 5TP39=11,13,17,19,29,31,41,43,47,49
	  dfac d_result, d_number

	  dift d_result = 1
	      d_try = d_number + 2
	      dfac d_result, d_try
	  dift d_result = 1
		ded$ s_any, d_number, 0, 0
		$dat s_dateline
		$cut s_dateline, s_dateline, 1, 20
		$sho s_any + " " + s_dateline

		$cut s_any, s_dateline, 13, 2
		$ift s_any <> s_hour
		    s_hour = s_any
		    d_any = d_number - d_beghour
		    ded$ s_any, d_any, 0, 0
		    ded$ s_out, d_number, 0, 0
		    $app s_out, " " + s_dateline + ", hr=" + s_any
		    $out s_out
		    fapp d_any, s_filename, s_out
		    dbad d_any = 0
		    d_beghour = d_number
		endi
	      d_try = d_number + 6
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 8
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 18
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 20
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 30
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 32
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 36
	      dfac d_result, d_try
	  dift d_result = 1
	      d_try = d_number + 38
	      dfac d_result, d_try
	  dift d_result = 1
	      $dat s_dot
		$cut s_dot, s_dot, 1, 20
		ded$ s_any, d_number, 0, 0
	      s_out = "] 000:5TP39= " + s_any + "  " + s_dot
		$out s_out
		fapp d_any, s_filename, s_out
		dbad d_any = 0
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi
	  endi

	  d_number = d_number + 210
    endw

    $inp s_any,"return"
ends sub_5tp39_find_simple_slow


subr sub_teaquad_5tp39_by_modulus_duo
'updated 2009/06/17, 2009/06/12, 2009/06/11, 2009/0610, 2009/06/09
'2009/06/06, 2009/05/15, 2009/05/12, 2009/04/27, 2009/04/26
'2009/04/25, 2009/04/24, 22009/04/21, 2009/04/19, 2009/04/18
'2009/04/16, 2009/04/11, 2009/04/10, 2009/04/09, 2009/04/08
'2009/04/07, 2009/04/04, 2009/04/02, 2009/04/01, 2009/03/29
'2009/03/24, 2009/03/22, 2009/03/18, 2009/03/17, 2009/03/16
'2009/03/12, 2009/03/11, 2009/03/09, 2009/03/08, 2009/03/05
'2009/03/04, 2009/03/03, 2009/03/02, 2009/03/01, 2009/02/26
'2009/02/24, 2009/02/22, 2009/02/20, 2009/02/19, 2009/02/14
'2009/02/13, 2009/02/01, 2009/01/29, 2009/01/25, 2009/01/24
'2009/01/19, 2008/12/22, 2008/12/06, 2008/11/23, 2008/11/09
'2008/10/27, 2008/10/20, 2008/09/27, 2008/09/21, 2008/09/16
'2008/09/13, 2008/09/08, 2008/08/27, 2008/08/14, 2008/07/18
'2008/07/16, 2008/07/15, 2008/07/13, 2008/07/12, 2008/07/09
'2008/07/08, 2008/07/07, 2008/07/06, 2008/07/05, 2008/07/03
'2008/07/02, 2008/06/09, 2008/06/02, 2008/05/31, 2008/05/30
'2008/05/15, 2008/05/14, 2008/05/12, 2008/05/10, 2008/04/29
'2008/04/15, 2008/04/10, 2008/04/07, 2008/04/06, 2008/03/17
'2008/03/15, 2008/03/13, 2008/03/06, 2008/02/29, 2008/02/28
'2008/02/21, 2008/02/14, 2008/02/07, 2008/01/08, 2008/01/06
'2008/01/03, 2008/01/02, 2007/12/22, 2007/12/21, 2007/12/09
'2007/11/12, 2007/11/05, 2007/11/03, 2007/10/29, 2007/10/19
'2007/10/18, 2007/10/17, 2007/10/13, 2007/10/08, 2007/10/07 
'2007/09/18, 2007/09/16, 2007/09/06, 2007/08/26, 2007/08/25
'2007/08/21, 2007/08/09, 2007/08/02, 2007/07/19, 2007/07/18
'2007/07/17, 2007/07/16, 2007/07/15, 2007/07/07, 2007/07/06
'2007/07/05, 2007/07/01, 2007/06/30, 2007/06/28, 2007/06/13
'2007/06/12, 2007/06/06, 2007/06/02, 2007/05/31, 2007/05/28
'2007/05/21, 2007/05/20, 2007/05/17, 2007/05/11, 2007/05/10
'2007/05/09, 2007/04/25, 2007/04/24, 2007/04/21, 2007/04/20
'2007/04/19, 2007/04/16, 2007/04/11, 2007/04/10, 2007/04/04
'2007/04/03, 2007/04/02, 2007/03/30, 2007/03/29, 2007/03/27
'2007/03/23, 2007/03/22, 2007/03/21, 2007/03/20, 2007/03/17
'2007/03/14, 2007/02/24, 2007/02/22, 2007/01/27, 2007/01/11
'2006/12/21, 2006/12/12, 2006/11/30, 2006/11/24, 2006/11/19
'2006/11/18, 2006/11/16, 2006/11/12, 2006/10/29, 2006/10/27
'2006/10/26, 2006/10/12, 2006/09/30, 2006/09/28, 2006/09/04
'2006/08/22, 2006/08/17, 2006/07/27, 2006/07/23, 2006/07/06
'2006/05/23, 2006/04/23, 2006/03/14, 2006/03/13, 2006/02/27
'2006/02/24, 2006/01/29, 2005/11/29, 2005/08/07, 2005/06/11
'2005/06/07, 2005/06/05, 2005/05/31, 2005/05/17, 2005/05/16
'2005/05/14, 2005/05/11, 2005/05/06, 2005/05/02, 2005/04/29
'2005/04/27, 2005/04/24, 2005/04/23, 2005/04/04, 2005/04/02
'2005/03/31, 2005/03/21, 2005/03/14, 2005/03/10, 2005/03/09 
'2005/03/08, 2005/03/03, 2005/03/02, 2005/02/27, 2005/02/24
'find 5TP39s by modulus
'for speed this subroutine uses GTAG and GOTO
    vari d_any, s_any, d_dot, s_dot, s_tap, s_out, d_ask
    vari s_test1, s_test2, s_test3, s_test4, s_test5, d_test
    vari d_good, s_beginnumber, d_begseconds
    vari s_datebegin, s_datelong, s_datenow
    vari s_1timehournew, s_2timehournew, d_2timehournew
    vari s_1timehourprev, s_2timehourprev, d_2timehourprev
    vari d_primetest, s_primetest
    vari d_dayteaquadpart, d_teaquadmaxpart, d_begin
    vari d_hourteaquadpart, d_qtpcount, d_hrcount
    vari d_accumdelta, d_billperhour, d_billion
    vari d_quadsec1, d_quadsec2, d_quadsec3
    vari d_pivcompart, s_pivcom, d_process, d_y630
    vari d_number, s_number, d_div, d_duofactor
    vari d_qtp20, d_debug
    vari d_index, d_maxindex, d_maxarrayprime, d_beglines
    vari d_filebyte, d_loop, s_record, s_file5tp39, s_line
    vari s_afile, s_bfile, s_2all, s_2code, d_long, d_which
    vari d_teaquadone, d_mod1, d_mod2, d_mod3
    vari d_teaquad11part, d_teaquad49part
    vari d_teaquadpart, d_teaquadmult
    vari d_tqmod011, d_tqmod013, d_tqmod17, d_tqmod19
    vari d_tqmod23, d_tqmod29, d_tqmod31, d_tqmod37
    vari d_tqmod41, d_tqmod43, d_tqmod47, d_tqmod53
    vari d_tqmod59, d_tqmod61, d_tqmod67, d_tqmod71
    vari d_tqmod73, d_tqmod79, d_tqmod83, d_tqmod89
    vari d_tqmod97, d_tqmod101, d_tqmod103, d_tqmod107
    vari d_tqmod109, d_tqmod113, d_tqmod127, d_tqmod131
    vari d_tqmod137, d_tqmod139, d_tqmod149, d_tqmod151

    'd_which=1 for begin again get number from file,qtp20
    'd_which=2 for enter file code, beg, end
    d_which = dg_pass1

    $sys s_any, 2
    $out s_any
    d_process = 1
    dpow d_teaquadone, 10, 15
    d_teaquadmult = 1
    dpow d_billion, 10, 9
    $dat s_datebegin

    '12345678901234567890
    '05-MAR-2009 01:05:26
    $cut s_datebegin, s_datebegin, 1, 17

    d_debug = 2
    d_qtp20 = 1
    dift d_which <> 1
        $inp s_any, "1=qtp20"
        $ift s_any = "*": dinc d_process
        $ift s_any <> "1": d_qtp20 = 2
    endi

    'which filename do we want in s_afile
    s_2all = "a1,a2,h1,h2,h3,n0,n1,n2,n3,n4,j1,j2,d1,d2,d3,"
    $app s_2all, "s1,s2,s3,s4,s5,s6,r1,r2,x1,x2,x3,x4,x5,x6,"
    $app s_2all, "y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,"
    $app s_2all, "w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,"
    s_2code = sg_nothing
    d_test = 1
    d_dot = 1
    d_loop = d_process
    dift d_qtp20 <> 1: dinc d_loop

    dwhi d_loop = 1
	  $par s_dot, s_2all, ",", d_dot
	  $len d_any, s_dot
	  dift d_any = 2
		s_afile = "qtp20" + s_dot + "a.txt"
		s_bfile = s_afile
		$rep s_bfile, 8, "b"

		flen d_any, s_afile
		dift d_any > 10
		    s_2code = s_dot
		    dinc d_loop
		    dinc d_test
		endi

		dinc d_dot
	  else
		dinc d_loop
	  endi
    endw

    d_dot = 1
    d_loop = d_process
    dift d_qtp20 = 1: dinc d_loop

    dwhi d_loop = 1
	  $par s_dot, s_2all, ",", d_dot
	  $len d_any, s_dot
	  dift d_any = 2
		s_afile = "a5tp39" + s_dot + ".txt"
		s_bfile = s_afile
		$rep s_bfile, 1, "b"

		flen d_any, s_afile
		dift d_any > 10
		    s_2code = s_dot
		    dinc d_loop
		    dinc d_test
		endi

		dinc d_dot
	  else
		dinc d_loop
	  endi
    endw

    dift d_test = 1
	  'we did not find a file so zz
	  s_2code = "z" + "z"
	  dift d_qtp20 = 1
	      s_afile = "qtp20zza.txt"
	      s_bfile = "qtp20zzb.txt"
	  else
	      s_afile = "a5tp39zz.txt"
	      s_bfile = "b5tp39zz.txt"
	  endi
    endi

    'd_which=1 for begin again get number from file,qtp20
    'd_which=2 for enter file code, beg, end
    d_ask = 2
    dift d_which = 2: d_ask = 1
    dift d_process <> 1: d_ask = 99999

    dift d_process <> 1: d_ask = 99999

   'default for d_maxindex 
   d_maxindex = 20000

    dift d_ask = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  'ask for d_maxindex
	  $inp s_any, "enter d_maxindex 100 to 20000"
	  $ift s_any = "*"
		dinc d_process
		dinc d_ask
	  endi 
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_maxindex, s_any
	  dift d_maxindex > 20000: d_maxindex = 20000
	  dift d_maxindex < 100: d_maxindex = 100
    endi

    d_any = 1
    dift d_process <> 1: dinc d_any
    dift d_any = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  'ask for file code
	  $out "a1,a2,d1,d2,d3,h1,h2,h3,n0,n1,n2,n3,n4,n5"
        $out "s1,s2,s3,s4,s5,s6,r1,r2,x1,x2,x3,x4,x5,x6"
	  $out "y0,y1,y2,y3,y4,y5,y6,y7,y8,y9"
	  $out "w0,w1,w2,w3,w4,w5,w6,w7,w8,w9"
	  $out "default files=" + s_afile + " and " + s_bfile

	  s_any = "enter different two letter file code, "
	  $app s_any, "return for default, zz=test"
	  $inp s_any, s_any
	  $ift s_any = "*"
		dinc d_process
		dinc d_ask
	  endi
	  $tlo s_any, s_any
	  $len d_any, s_any
	  dift d_any = 2: s_2code = s_any
    endi
    dift d_process = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  dift d_qtp20 = 1
	      s_afile = "qtp20" + s_2code + "a.txt"
		s_bfile = s_afile
	      $rep s_bfile, 8, "b"
	  else
	      s_afile = "a5tp39" + s_2code + ".txt"
		s_bfile = s_afile
	      $rep s_bfile, 1, "b"
	  endi

	  $out "looking at files=" + s_afile + " and " + s_bfile

	  'get beginning number from file
	  d_teaquad11part = 0
	  d_teaquadmult = 0
	  d_filebyte = 1
	  d_loop = 1

	  dwhi d_loop = 1
		'read through file to get last number
		fsip s_record, s_afile, d_filebyte

		dift d_filebyte = 0
		    dinc d_loop
		else
		    $tup s_record, s_record
		    $ift s_record = "STOP"
			  $inp s_any, "STOP for " + s_2code
			  dinc d_loop
			  dinc d_process
			  dinc d_ask
		    endi

		    $app s_record, " "
		    $lok d_any, s_record, 1, " "
		    $cut s_any, s_record, 1, d_any

		    'do we have a number
		    sg_pass1 = s_any
		    sub_teaquad_from_string
		    d_any = 2
		    dift dg_pass1 > 0: d_any = 1
		    dift dg_pass2 > 0: d_any = 1
		    dift d_any = 1
			  'we did get a number
			  s_line = s_record
		        d_teaquad11part = dg_pass1
		        d_teaquadmult = dg_pass2
		    endi
		endi	 
	  endw
    endi
    dift d_process = 1
	  'show d_teaquadmult,d_teaquad11part
	  ded$ s_any, d_teaquad11part, 0, 0
	  $out "file mult=" + d_teaquadmult + " part=" + s_any
	  dift d_teaquad11part > 0: $out "last=" + s_line
	  dift d_which = 1: d_ask = 2
	  dift d_teaquad11part = 0: d_ask = 1
	  $ift s_2code = "zz": d_ask = 1
    endi

    dift d_process <> 1: d_ask = 99999
    d_test = 0
    dift d_ask = 1	 
	  'ask for beginning number

	  'enter beginning number
	  s_test1 = "9,999,900,000,000,000"
	  s_test2 = "9,999,800,000,000,000"
	  s_test3 = "9,999,700,000,000,000"
	  s_test4 = "9,999,600,000,000,000"
	  s_test5 = "9,999,500,000,000,000"

	  $out "test1=" + s_test1
	  $out "test2=" + s_test2
	  $out "test3=" + s_test3
	  $out "test4=" + s_test4
	  $out "test5=" + s_test5
	  $out "E15=in quadrillions"

	  dg_pass1 = d_teaquad11part
	  dg_pass2 = d_teaquadmult
	  sub_teaquad_to_string
	  s_number = sg_pass1
	  $out "beg=" + s_number

	  $out "debug=debug"
        s_out = "12345678901234567890123, or test1,test2,..."
	  $inp s_any, s_out

	  $tup s_any, s_any
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "DEBUG"
		d_debug = 1
		$inp s_any, s_out
	      $tup s_any, s_any
	      $ift s_any = "*": dinc d_process
	  endi

	  d_test = 0

	  $ift s_any = "TEST1": d_test = 1
	  $ift s_any = "TEST2": d_test = 2
	  $ift s_any = "TEST3": d_test = 3
	  $ift s_any = "TEST4": d_test = 4
	  $ift s_any = "TEST5": d_test = 5
	  
	  $ift s_any = "TEST1": s_any = s_test1
	  $ift s_any = "TEST2": s_any = s_test2
	  $ift s_any = "TEST3": s_any = s_test3
	  $ift s_any = "TEST4": s_any = s_test4
	  $ift s_any = "TEST5": s_any = s_test5
	  s_test1 = s_any

	  'do we have a "E15" for quadrillions
	  $lok d_any, s_any, 1, "E15"
	  dift d_any > 0
		ddec d_any
		$cut s_any, s_any, 1, d_any
		$app s_any, ",000,000,000,000,000"
		$out s_any
	  endi

	  $trb s_any, s_any
	  $len d_any, s_any
	  dift d_any > 0
	      sg_pass1 = s_any
	      sub_teaquad_from_string
	      d_teaquad11part = dg_pass1
	      d_teaquadmult = dg_pass2
	  endi
    endi
    dift d_process = 1
	  $ch$ s_any, "-", 70
	  $out s_any

        $out "files=" + s_afile + " and " + s_bfile

	  'minimum is 1,000,000
	  dift d_teaquadmult = 0
		d_any = 10 ^ 6
		dift d_teaquad11part < d_any: d_teaquad11part = d_any
	  endi

	  'show d_teaquadmult,d_teaquad11part
	  ded$ s_any, d_teaquad11part, 0, 0
	  $out "mult=" + d_teaquadmult + " part=" + s_any

	  'find the PIVCOM of d_teaquadmult,d_teaquad11part
        'term PIVCOM was invented by Roger Hargrave on 2002/08/11
        'find d_pivcompart for d_teaquadmult, d_teaquad11part

	  'first drop back a bit for conservatism.
	  d_teaquad11part = d_teaquad11part - 10000

	  'old method PIVCOM
	  dpow d_teaquadone, 10, 15
	  d_mod1 = d_teaquad11part % 210
	  d_mod2 = d_teaquadone % 210 * d_teaquadmult
	  d_mod3 = d_mod1 + d_mod2 % 210
	  d_pivcompart = d_teaquad11part - d_mod3

	  'new method PIVCOM
	  d_mod1 = d_teaquadone % 210
	  d_mod2 = d_mod1 * d_teaquadmult + d_teaquad11part % 210
	  d_pivcompart = d_teaquad11part - d_mod2

	  'show the PIVCOM in d_teaquadmult,d_pivcompart	  
	  dg_pass1 = d_pivcompart
	  dg_pass2 = d_teaquadmult
	  sub_teaquad_to_string
	  s_pivcom = sg_pass1
	  $out "pivcom=" + s_pivcom

        'find the place to begin
        d_teaquad11part = d_pivcompart - 19
	  dift d_teaquad11part < 0
		d_teaquad11part = d_teaquad11part + 210
	  endi

	  'show begin in d_teaquadmult,d_teaquad11part
	  ded$ s_any, d_teaquad11part, 0, 0
	  $out "beg mult=" + d_teaquadmult + " part=" + s_any

	  $ch$ s_any, "-", 70
	  $out s_any

        'output beginning numbers to file
        $dat s_datenow
        $cut s_datenow, s_datenow, 1, 17

	  dg_pass1 = d_teaquad11part
	  dg_pass2 = d_teaquadmult
	  sub_teaquad_to_string
	  s_beginnumber = sg_pass1

	  'output beginning number 
        s_out = "begin=" + s_beginnumber + " " + s_datenow
	  $app s_out, " " + s_afile
        $out s_out

	  'output name of afile to file
        fapp d_any, s_afile, s_out
        dbad d_any = 0

	  'output interpreter name and build
	  $sys s_out, 3
	  $out s_out

	  fapp d_any, s_afile, s_out
	  dbad d_any = 0

	  'output current program name and build
	  $out sg_build
	  fapp d_any, s_afile, sg_build
	  dbad d_any = 0

	  'output interpreter path
	  $sys s_out, 1
	  $out s_out
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0

        'put d_maxindex primes in decimal array
	  'd_maxindex is asked for above
        d_number = 157
        d_index = 1
        dwhi d_index <= d_maxindex
	      d_mod1 = 9999
	      dwhi d_mod1 > 1
		    dfac d_mod1, d_number
		    dift d_mod1 > 1: d_number = d_number + 2
	      endw
	      dtoi d_index, d_number
	      d_number = d_number + 2
	      dinc d_index
        endw
	  itod d_any, 1
	  itod d_maxarrayprime, d_maxindex
	  s_any = "array from=" + d_any + " to " + d_maxarrayprime
	  $app s_any, " ct=" + d_maxindex
	  $out s_any + " " + s_afile
    endi
    dift d_process = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  $out "last=" + s_line

	  'output beginning number
	  $out "beg= " + s_beginnumber + " " + s_2code

	  'get the maximum number to go to
	  d_teaquadmaxpart = d_teaquadone

	  dg_pass1 = d_teaquadmaxpart
	  dg_pass2 = d_teaquadmult
	  sub_teaquad_to_string
	  s_number = sg_pass1
	  $out "max= " + s_number + " " + s_2code
    endi
    d_tqmod011 = d_teaquadone % 11 * d_teaquadmult % 11
    d_tqmod013 = d_teaquadone % 13 * d_teaquadmult % 13
    d_tqmod17 = d_teaquadone % 17 * d_teaquadmult % 17
    d_tqmod19 = d_teaquadone % 19 * d_teaquadmult % 19
    d_tqmod23 = d_teaquadone % 23 * d_teaquadmult % 23
    d_tqmod29 = d_teaquadone % 29 * d_teaquadmult % 29
    d_tqmod31 = d_teaquadone % 31 * d_teaquadmult % 31
    d_tqmod37 = d_teaquadone % 37 * d_teaquadmult % 37
    d_tqmod41 = d_teaquadone % 41 * d_teaquadmult % 41
    d_tqmod43 = d_teaquadone % 43 * d_teaquadmult % 43
    d_tqmod47 = d_teaquadone % 47 * d_teaquadmult % 47
    d_tqmod53 = d_teaquadone % 53 * d_teaquadmult % 53
    d_tqmod59 = d_teaquadone % 59 * d_teaquadmult % 59
    d_tqmod61 = d_teaquadone % 61 * d_teaquadmult % 61
    d_tqmod67 = d_teaquadone % 67 * d_teaquadmult % 67
    d_tqmod71 = d_teaquadone % 71 * d_teaquadmult % 71
    d_tqmod73 = d_teaquadone % 73 * d_teaquadmult % 73
    d_tqmod79 = d_teaquadone % 79 * d_teaquadmult % 79
    d_tqmod83 = d_teaquadone % 83 * d_teaquadmult % 83
    d_tqmod89 = d_teaquadone % 89 * d_teaquadmult % 89
    d_tqmod97 = d_teaquadone % 97 * d_teaquadmult % 97
    d_tqmod101 = d_teaquadone % 101 * d_teaquadmult % 101
    d_tqmod103 = d_teaquadone % 103 * d_teaquadmult % 103
    d_tqmod107 = d_teaquadone % 107 * d_teaquadmult % 107
    d_tqmod109 = d_teaquadone % 109 * d_teaquadmult % 109
    d_tqmod113 = d_teaquadone % 113 * d_teaquadmult % 113
    d_tqmod127 = d_teaquadone % 127 * d_teaquadmult % 127
    d_tqmod131 = d_teaquadone % 131 * d_teaquadmult % 131
    d_tqmod137 = d_teaquadone % 137 * d_teaquadmult % 137
    d_tqmod139 = d_teaquadone % 139 * d_teaquadmult % 139
    d_tqmod149 = d_teaquadone % 149 * d_teaquadmult % 149
    d_tqmod151 = d_teaquadone % 151 * d_teaquadmult % 151

    'p49 is d_teaquad49part, d_teaquadmult not p11
    d_teaquad49part = d_teaquad11part - 210 + 38

    'adjust d_teaquad49part to make d_pivcompart mod 11 = 4 or 7
    d_pivcompart = d_teaquad49part - 19
    d_mod1 = d_teaquadone % 11 * d_teaquadmult + d_pivcompart % 11

    dift d_mod1 <= 4
	  d_any = 4 - d_mod1 * 210
	  d_teaquad49part = d_teaquad49part + d_any
	  d_y630 = 1
    else
	  dift d_mod1 <= 7
		d_any = 7 - d_mod1 * 210
	      d_teaquad49part = d_teaquad49part + d_any
		d_y630 = 2
	  else
		d_any = 15 - d_mod1 * 210
	      d_teaquad49part = d_teaquad49part + d_any
		d_y630 = 1
	  endi	  
    endi

'12345678901234567890123456789012345
'17-DEC-2002 03:56:22 20021217035622
    'get second digit of the hour to test for hour change
    $dat s_datelong
    $cut s_1timehournew, s_datelong, 14, 1
    $cut s_2timehournew, s_datelong, 13, 2
    s_1timehourprev = s_1timehournew
    s_2timehourprev = s_2timehournew

    d_2timehourprev = 99999

    '12345678901234567890
    '05-MAR-2009 01:05:26
    $cut s_datebegin, s_datelong, 1, 17

    dift d_process = 1
	  'output begin date to file
        s_out = "date=" + s_datelong + " " + s_afile

        $out s_out
        fapp d_any, s_afile, s_out
        dbad d_any = 0
    endi

    d_qtpcount = 0
    d_hrcount = -1
    d_accumdelta = 0

    'put begin lines in d_beglines
    dsys d_beglines, 2

    d_dayteaquadpart = d_teaquad49part - 38
    d_hourteaquadpart = d_dayteaquadpart

    dsec d_begseconds
'HERE sub_teaquad_5tp39_by_modulus_duo

dift d_process = 1    
    'main loop gtag here
    gtag tag_nextnumber

    'increment d_primetest = first prime
    'd_teaquad49part = d_teaquad49part + 210
    dift d_y630 = 1
	  'increment by 210 * 3 = 630
        d_teaquad49part = d_teaquad49part + 630
	  dinc d_y630
    else
	  'increment by 210 * 8 = 1680
        d_teaquad49part = d_teaquad49part + 1680
	  ddec d_y630
    endi

    'mod 13
    'p49%13 must be 1, 3, 9, or 11 to be good
    'd_tqmod013 = d_teaquadone % 13 * d_teaquadmult % 13
    d_mod1 = d_tqmod013 + d_teaquad49part % 13
    dift d_mod1 <> 1
	  dift d_mod1 <> 3
		dift d_mod1 <> 9
		    dift d_mod1 <> 11: goto tag_nextnumber
		endi
	  endi
    endi

    'mod 17
    'p49%17 must not be <5, 6, 8, 13, 15 to be good
    'd_tqmod17 = d_teaquadone % 17 * d_teaquadmult % 17
    d_mod1 = d_tqmod17 + d_teaquad49part % 17
    dift d_mod1 < 5: goto tag_nextnumber
    dift d_mod1 = 6: goto tag_nextnumber
    dift d_mod1 = 8: goto tag_nextnumber
    dift d_mod1 = 13: goto tag_nextnumber
    dift d_mod1 = 15: goto tag_nextnumber

    'mod 19
    'p49%19 must not be <3, 6, 8, 11, 13, >16 to be good
    'd_tqmod19 = d_teaquadone % 19 * d_teaquadmult % 19
    d_mod1 = d_tqmod19 + d_teaquad49part % 19
    dift d_mod1 < 3: goto tag_nextnumber
    dift d_mod1 = 6: goto tag_nextnumber
    dift d_mod1 = 8: goto tag_nextnumber
    dift d_mod1 = 11: goto tag_nextnumber
    dift d_mod1 = 13: goto tag_nextnumber
    dift d_mod1 > 16: goto tag_nextnumber

    'mod 23
    'p49%23 must not be 0, 2, >5 and <10, 13, 15, 18, 20 to be good
    'd_tqmod23 = d_teaquadone % 23 * d_teaquadmult % 23
    d_mod1 = d_tqmod23 + d_teaquad49part % 23
    dift d_mod1 = 0: goto tag_nextnumber
    dift d_mod1 = 2: goto tag_nextnumber
    dift d_mod1 > 5
	  dift d_mod1 < 10: goto tag_nextnumber
    endi
    dift d_mod1 = 13: goto tag_nextnumber
    dift d_mod1 = 15: goto tag_nextnumber
    dift d_mod1 = 18: goto tag_nextnumber
    dift d_mod1 = 20: goto tag_nextnumber
  
    'mod 29
    'p49%29 must not be <4, >5 and <10, 18, 20 to be good
    'd_tqmod29 = d_teaquadone % 29 * d_teaquadmult % 29
    d_mod1 = d_tqmod29 + d_teaquad49part % 29
    dift d_mod1 < 4: goto tag_nextnumber
    dift d_mod1 > 5
	  dift d_mod1 < 10: goto tag_nextnumber
    endi
    dift d_mod1 = 18: goto tag_nextnumber
    dift d_mod1 = 20: goto tag_nextnumber
  
    'mod 31
    'p49%31 must not be <3, >4 and <9, 18, 20, 30 to be good
    'd_tqmod31 = d_teaquadone % 31 * d_teaquadmult % 31
    d_mod1 = d_tqmod31 + d_teaquad49part % 31
    dift d_mod1 < 3: goto tag_nextnumber
    dift d_mod1 > 4
	  dift d_mod1 < 9: goto tag_nextnumber
    endi
    dift d_mod1 = 18: goto tag_nextnumber
    dift d_mod1 = 20: goto tag_nextnumber
    dift d_mod1 = 30: goto tag_nextnumber
  
    'mod 37
    'p49%37 must not be <3, 6, 8, 18, 20, 30, 32, 36 to be good
    'd_tqmod37 = d_teaquadone % 37 * d_teaquadmult % 37
    d_mod1 = d_tqmod37 + d_teaquad49part % 37
    dift d_mod1 < 3: goto tag_nextnumber
    dift d_mod1 = 6: goto tag_nextnumber
    dift d_mod1 = 8: goto tag_nextnumber
    dift d_mod1 = 18: goto tag_nextnumber
    dift d_mod1 = 20: goto tag_nextnumber
    dift d_mod1 = 30: goto tag_nextnumber
    dift d_mod1 = 32: goto tag_nextnumber
    dift d_mod1 = 36: goto tag_nextnumber
  
    'mod 41
    'p49%41 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod41 = d_teaquadone % 41 * d_teaquadmult % 41
    d_mod1 = d_tqmod41 + d_teaquad49part % 41
    dift d_mod1 < 19 
        dift d_mod1 = 0: goto tag_nextnumber
        dift d_mod1 = 2: goto tag_nextnumber
        dift d_mod1 = 6: goto tag_nextnumber
        dift d_mod1 = 8: goto tag_nextnumber
        dift d_mod1 = 18: goto tag_nextnumber
    else
        dift d_mod1 = 20: goto tag_nextnumber
        dift d_mod1 = 30: goto tag_nextnumber
        dift d_mod1 = 32: goto tag_nextnumber
        dift d_mod1 = 36: goto tag_nextnumber
        dift d_mod1 = 38: goto tag_nextnumber
    endi
  
    'mod 43
    'p49%43 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod43 = d_teaquadone % 43 * d_teaquadmult % 43
    d_mod1 = d_tqmod43 + d_teaquad49part % 43
    dift d_mod1 < 19 
        dift d_mod1 = 0: goto tag_nextnumber
        dift d_mod1 = 2: goto tag_nextnumber
        dift d_mod1 = 6: goto tag_nextnumber
        dift d_mod1 = 8: goto tag_nextnumber
        dift d_mod1 = 18: goto tag_nextnumber
    else
        dift d_mod1 = 20: goto tag_nextnumber
        dift d_mod1 = 30: goto tag_nextnumber
        dift d_mod1 = 32: goto tag_nextnumber
        dift d_mod1 = 36: goto tag_nextnumber
        dift d_mod1 = 38: goto tag_nextnumber
    endi
  
    'mod 47
    'p49%47 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod47 = d_teaquadone % 47 * d_teaquadmult
    d_mod1 = d_tqmod47 + d_teaquad49part % 47
    dift d_mod1 < 19 
        dift d_mod1 = 0: goto tag_nextnumber
        dift d_mod1 = 2: goto tag_nextnumber
        dift d_mod1 = 6: goto tag_nextnumber
        dift d_mod1 = 8: goto tag_nextnumber
        dift d_mod1 = 18: goto tag_nextnumber
    else
        dift d_mod1 = 20: goto tag_nextnumber
        dift d_mod1 = 30: goto tag_nextnumber
        dift d_mod1 = 32: goto tag_nextnumber
        dift d_mod1 = 36: goto tag_nextnumber
        dift d_mod1 = 38: goto tag_nextnumber
    endi

    'mod 53
    'p49%53 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod53 = d_teaquadone % 53 * d_teaquadmult % 53
    d_mod1 = d_tqmod53 + d_teaquad49part % 53
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 59
    'p49%59 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod59 = d_teaquadone % 59 * d_teaquadmult % 59
    d_mod1 = d_tqmod59 + d_teaquad49part % 59
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 61
    'p49%61 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod61 = d_teaquadone % 61 * d_teaquadmult % 61
    d_mod1 = d_tqmod61 + d_teaquad49part % 61
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 67
    'p49%67 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod67 = d_teaquadone % 67 * d_teaquadmult % 67
    d_mod1 = d_tqmod67 + d_teaquad49part % 67
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 71
    'p49%71 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod71 = d_teaquadone % 71 * d_teaquadmult % 71
    d_mod1 = d_tqmod71 + d_teaquad49part % 71
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 73
    'p49%73 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod73 = d_teaquadone % 73 * d_teaquadmult % 73
    d_mod1 = d_tqmod73 + d_teaquad49part % 73
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 79
    'p49%79 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod79 = d_teaquadone % 79 * d_teaquadmult % 79
    d_mod1 = d_tqmod79 + d_teaquad49part % 79
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 83
    'p49%83 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod83 = d_teaquadone % 83 * d_teaquadmult % 83
    d_mod1 = d_tqmod83 + d_teaquad49part % 83
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 89
    'p49%89 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod89 = d_teaquadone % 89 * d_teaquadmult % 89
    d_mod1 = d_tqmod89 + d_teaquad49part % 89
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 97
    'p49%97 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod97 = d_teaquadone % 97 * d_teaquadmult % 97
    d_mod1 = d_tqmod97 + d_teaquad49part % 97
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 101
    'p49%101 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod101 = d_teaquadone % 101 * d_teaquadmult % 101
    d_mod1 = d_tqmod101 + d_teaquad49part % 101
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 103
    'p49%103 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod103 = d_teaquadone % 103 * d_teaquadmult % 103
    d_mod1 = d_tqmod103 + d_teaquad49part % 103
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 107
    'p49%107 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod107 = d_teaquadone % 107 * d_teaquadmult % 107
    d_mod1 = d_tqmod107 + d_teaquad49part % 107
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 109
    'p49%109 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod109 = d_teaquadone % 109 * d_teaquadmult % 109
    d_mod1 = d_tqmod109 + d_teaquad49part % 109
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 113
    'p49%113 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod113 = d_teaquadone % 113 * d_teaquadmult % 113
    d_mod1 = d_tqmod113 + d_teaquad49part % 113
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 127
    'p49%127 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod127 = d_teaquadone % 127 * d_teaquadmult % 127
    d_mod1 = d_tqmod127 + d_teaquad49part % 127
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 131
    'p49%131 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod131 = d_teaquadone % 131 * d_teaquadmult % 131
    d_mod1 = d_tqmod131 + d_teaquad49part % 131
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 137
    'p49%137 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod137 = d_teaquadone % 137 * d_teaquadmult % 137
    d_mod1 = d_tqmod137 + d_teaquad49part % 137
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 139
    'p49%139 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod139 = d_teaquadone % 139 * d_teaquadmult % 139
    d_mod1 = d_tqmod139 + d_teaquad49part % 139
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 149
    'p49%149 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod149 = d_teaquadone % 149 * d_teaquadmult % 149
    d_mod1 = d_tqmod149 + d_teaquad49part % 149
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    'mod 151
    'p49%151 bad are 0,2,6,8,18,20,30,32,36,38
    'd_tqmod151 = d_teaquadone % 151 * d_teaquadmult % 151
    d_mod1 = d_tqmod151 + d_teaquad49part % 151
    dift d_mod1 < 39
        dift d_mod1 < 19 
            dift d_mod1 = 0: goto tag_nextnumber
            dift d_mod1 = 2: goto tag_nextnumber
            dift d_mod1 = 6: goto tag_nextnumber
            dift d_mod1 = 8: goto tag_nextnumber
            dift d_mod1 = 18: goto tag_nextnumber
        else
            dift d_mod1 = 20: goto tag_nextnumber
            dift d_mod1 = 30: goto tag_nextnumber
            dift d_mod1 = 32: goto tag_nextnumber
            dift d_mod1 = 36: goto tag_nextnumber
            dift d_mod1 = 38: goto tag_nextnumber
        endi
    endi

    '157 is in the array with index=1
    d_index = 1
    gtag tag_nextindex
        itod d_div, d_index

'd_teaquadone is 10^15
d_mod1=d_teaquadone % d_div * d_teaquadmult + d_teaquad49part % d_div

	  dift d_mod1 < 39
            dift d_mod1 < 19 
                dift d_mod1 = 0: goto tag_nextnumber
                dift d_mod1 = 2: goto tag_nextnumber
                dift d_mod1 = 6: goto tag_nextnumber
                dift d_mod1 = 8: goto tag_nextnumber
                dift d_mod1 = 18: goto tag_nextnumber
            else
                dift d_mod1 = 20: goto tag_nextnumber
                dift d_mod1 = 30: goto tag_nextnumber
                dift d_mod1 = 32: goto tag_nextnumber
                dift d_mod1 = 36: goto tag_nextnumber
                dift d_mod1 = 38: goto tag_nextnumber
            endi
        endi

	  dinc d_index
    dift d_index <= d_maxindex: goto tag_nextindex

'HERE sub_teaquad_5tp39_by_modulus_duo

    'get d_quadsec1 at begin of testing
    dsec d_quadsec1

    'test the p11,p13 duo
    d_teaquad11part = d_teaquad49part - 38
    dduo d_duofactor, d_teaquad11part, d_teaquadmult

    dift d_debug = 1
	  dsec d_any
	  d_any = d_any - d_begseconds

	  ded$ s_any, d_duofactor, 15, 0

        dg_pass1 = d_teaquad11part
        dg_pass2 = d_teaquadmult
        sub_teaquad_to_string
        s_dot = sg_pass1

	  s_out = "fact=" + s_any + " num=" + s_dot
	  $app s_out, " secs=" + d_any
	  $out s_out
    endi
    dift d_duofactor <> 1
	  dift d_duofactor <= d_maxarrayprime
		s_out = "duofactor=" + d_duofactor
		$app s_out, " less than=" + d_maxarrayprime
		$app s_out, " num=" + d_teaquadmult + " "
		$app s_out, d_teaquad11part

		$out s_out
  	      fapp d_any, s_afile, s_out
	  endi

	  goto tag_nextnumber
    endi

'12345678901234567890123456789012345
'17-DEC-2002 03:56:22 20021217035622
    'get second digit of the hour to test for hour change
    $dat s_datelong
    $cut s_1timehournew, s_datelong, 14, 1

    dg_pass1 = d_teaquad11part
    dg_pass2 = d_teaquadmult
    sub_teaquad_to_string
    s_primetest = sg_pass1
    s_out = s_primetest + " " + s_datelong
    $sho s_out

    $ift s_1timehournew <> s_1timehourprev
	  s_1timehourprev = s_1timehournew

	  '12345678901234567890123456789012345
	  '17-DEC-2002 03:56:22 20021217035622
        'get 20 long s_datenow
        $cut s_datenow, s_datelong, 1, 17
        $cut s_2timehournew, s_datelong, 13, 2

	  'we have new hour
	  'is there a problem with it
        $tod d_2timehournew, s_2timehournew

        'd_2timehourprev was initialized to 99999
	  dift d_2timehourprev <> 99999
	      d_dot = d_2timehournew - 1
	      dift d_dot < 0: d_dot = 23
	      dift d_dot <> d_2timehourprev
		    s_out = "bad hour old=" + s_2timehourprev
		    $app s_out, ", new=" + s_2timehournew

		    $out s_out

	  	    fapp d_any, s_afile, s_out
	  	    dbad d_any = 0
		endi
	  endi

	  d_2timehourprev = d_2timehournew
	  s_2timehourprev = s_2timehournew

	  dinc d_hrcount

	  'get d_billperhour change
	  dift d_hrcount < 1: d_hourteaquadpart = d_teaquad11part
	  d_dot = d_teaquad11part - d_hourteaquadpart
	  d_accumdelta = d_accumdelta + d_dot

	  d_billperhour = 0
	  dift d_hrcount > 0
		dift d_hrcount > 24
		    'prorate to 24 hours
		    d_accumdelta = d_accumdelta / 25 * 24
		    d_billperhour = d_accumdelta / 24
		    d_billperhour = d_billperhour / d_billion @ 0
		else
		    d_billperhour = d_accumdelta / d_hrcount
		    d_billperhour = d_billperhour / d_billion @ 0
		endi
	  endi

	  d_hourteaquadpart = d_teaquad11part

        s_out = s_primetest + " " + s_datenow
	  $app s_out, " bph:" + d_billperhour + " " + d_hrcount
	  $app s_out, " " + d_qtpcount

	  fapp d_any, s_afile, s_out
	  dbad d_any = 0

        $out s_out + " " + s_2code

	  $ift s_2timehournew = "06"
		'12345678901234567890
		'Program: tinytea.exe, build 523, 2008/03/17
		'Program: teaprime.tea, build=532, 2008/03/15

	      'output interpreter name and build 
		'with begin date and d_qtpcount
	      $sys s_dot, 3
		$cut s_dot, s_dot, 10, 99
		$trb s_dot, s_dot
		s_out = s_dot + " beg=" + s_datebegin
		$app s_out, " " + d_qtpcount + " " + s_2code

	      fapp d_any, s_afile, s_out
	      dbad d_any = 0

		$out s_out

		'output teaprime.tea build and lines
		$cut s_dot, sg_build, 10, 99
		$trb s_dot, s_dot

		'get the lines of Teapro
		dsys d_any, 2
		ded$ s_any, d_any, 0, 0
		s_out = s_dot + ", lines=" + s_any

		'get day part diff
		d_any = d_teaquad11part - d_dayteaquadpart

		'we do prorate
		'get trillion per day
		d_dot = 10 ^ 12
		d_any = d_any / d_dot

		'prorate d_any if needed for trillion/day
		dift d_hrcount < 24
		    dift d_hrcount > 0		
		        d_any = d_any * 24 / d_hrcount
		    endi
		endi

		dto$ s_any, d_any, 5, 3
		$app s_out, " tpd:" + s_any
		d_dayteaquadpart = d_teaquad11part

	      fapp d_any, s_afile, s_out
	      dbad d_any = 0

		$out s_out
	  endi
    endi

    dift d_teaquad11part > d_teaquadmaxpart
	  'we are at end of this session of numbers
	  'd_teaquadmaxpart is d_teaquadone

	  'output current prime Teaquad number
        dg_pass1 = d_teaquad11part
        dg_pass2 = d_teaquadmult
        sub_teaquad_to_string
        s_primetest = sg_pass1
        s_out = s_primetest + " " + s_datenow
        $out s_out

        dift d_test > 0
		$out s_test1
		dsec d_any
		d_any = d_any - d_begseconds
		s_out = "test" + d_test + " seconds=" + d_any
		dsys d_any, 2
		d_any = d_any - d_beglines
		ded$ s_any, d_any, 0, 0
		$app s_out, " lines=" + s_any
		$out s_out

		$inp s_any, "stop"
		goto tag_endsubr
        endi

	  'output beginning and ending dates and afile
	  s_out = "beg=" + s_datebegin
	  $app s_out, " end=" + s_datenow
	  $app s_out, " " + s_afile
	  $out s_out
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0
	  fapp d_any, s_bfile, s_out
	  dbad d_any = 0

	  'begin and end primes
	  s_out = "beg=" + s_beginnumber + " end=" + s_primetest
	  $out s_out
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0
	  fapp d_any, s_bfile, s_out
	  dbad d_any = 0

	  'output afile name and line count
	  dsys d_any, 2
	  ded$ s_any, d_any, 0, 0
	  s_out = s_afile + " lines=" + s_any
	  $out s_out
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0

	  'output interpreter path
	  $sys s_dot, 1
	  s_out = "path=" + s_dot
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0

	  'output interpreter name and build
	  $sys s_out, 3
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0
	  fapp d_any, s_bfile, s_out
	  dbad d_any = 0

	  'output current Teapro program name and build
	  s_out = sg_build
	  fapp d_any, s_afile, s_out
	  dbad d_any = 0
	  fapp d_any, s_bfile, s_out
	  dbad d_any = 0

	  'if j1,j2,r1,r2 we do not want to end program
	  '123456789012
	  'a5tp39j1.txt
	  'qtp20j1a.txt
	  $cut s_any, s_afile, 1, 3
	  $ift s_any = "qtp"
	      $cut s_any, s_afile, 6, 1
	  else
	      $cut s_any, s_afile, 7, 1
	  endi
	  d_dot = 1
	  $ift s_any = "j": dinc d_dot
	  $ift s_any = "u": dinc d_dot

	  dift d_dot = 1
		'end current program
	      sub_path_prog_memory
	      $inp s_any, "done"
	      endp
	  endi

	  'if continuing we need to bump d_teaquadmaxpart
	  'd_teaquadmaxpart is always d_teaquadone
	  'd_teaquadone is 1E15 or 10^15
	  dinc d_teaquadmult

	  d_teaquad11part = d_teaquad11part - d_teaquadone
	  d_teaquad49part = d_teaquad49part - d_teaquadone

	  '12345678901234567890123456789012345
	  '17-DEC-2002 03:56:22 20021217035622
        'get second digit of the hour to test for hour change
        $dat s_datelong
        s_1timehournew = "x"
        $cut s_2timehournew, s_datelong, 13, 2
	  s_1timehourprev = s_1timehournew
	  s_2timehourprev = s_2timehournew
	  d_2timehourprev = 99999

	  'initialize various counters
	  d_dayteaquadpart = 0
	  d_hrcount = -1
	  d_accumdelta = 0
	  d_qtpcount = 0

        d_tqmod011 = d_teaquadone % 11 * d_teaquadmult % 11
        d_tqmod013 = d_teaquadone % 13 * d_teaquadmult % 13
        d_tqmod17 = d_teaquadone % 17 * d_teaquadmult % 17
        d_tqmod19 = d_teaquadone % 19 * d_teaquadmult % 19
        d_tqmod23 = d_teaquadone % 23 * d_teaquadmult % 23
        d_tqmod29 = d_teaquadone % 29 * d_teaquadmult % 29
        d_tqmod31 = d_teaquadone % 31 * d_teaquadmult % 31
        d_tqmod37 = d_teaquadone % 37 * d_teaquadmult % 37
        d_tqmod41 = d_teaquadone % 41 * d_teaquadmult % 41
        d_tqmod43 = d_teaquadone % 43 * d_teaquadmult % 43
        d_tqmod47 = d_teaquadone % 47 * d_teaquadmult % 47
        d_tqmod53 = d_teaquadone % 53 * d_teaquadmult % 53
        d_tqmod59 = d_teaquadone % 59 * d_teaquadmult % 59
        d_tqmod61 = d_teaquadone % 61 * d_teaquadmult % 61
        d_tqmod67 = d_teaquadone % 67 * d_teaquadmult % 67
        d_tqmod71 = d_teaquadone % 71 * d_teaquadmult % 71
        d_tqmod73 = d_teaquadone % 73 * d_teaquadmult % 73
        d_tqmod79 = d_teaquadone % 79 * d_teaquadmult % 79
        d_tqmod83 = d_teaquadone % 83 * d_teaquadmult % 83
        d_tqmod89 = d_teaquadone % 89 * d_teaquadmult % 89
        d_tqmod97 = d_teaquadone % 97 * d_teaquadmult % 97
        d_tqmod101 = d_teaquadone % 101 * d_teaquadmult % 101
        d_tqmod103 = d_teaquadone % 103 * d_teaquadmult % 103
        d_tqmod107 = d_teaquadone % 107 * d_teaquadmult % 107
        d_tqmod109 = d_teaquadone % 109 * d_teaquadmult % 109
        d_tqmod113 = d_teaquadone % 113 * d_teaquadmult % 113
        d_tqmod127 = d_teaquadone % 127 * d_teaquadmult % 127
        d_tqmod131 = d_teaquadone % 131 * d_teaquadmult % 131
        d_tqmod137 = d_teaquadone % 137 * d_teaquadmult % 137
        d_tqmod139 = d_teaquadone % 139 * d_teaquadmult % 139
        d_tqmod149 = d_teaquadone % 149 * d_teaquadmult % 149
        d_tqmod151 = d_teaquadone % 151 * d_teaquadmult % 151
    endi

    'test the p17,p19 duo
    d_teaquadpart = d_teaquad11part + 6
    dduo d_duofactor, d_teaquadpart, d_teaquadmult
    dift d_duofactor <> 1
	  dift d_duofactor <= d_maxarrayprime
		s_out = "duofactor=" + d_duofactor
		$app s_out, " less than=" + d_maxarrayprime
		$app s_out, " num=" + d_teaquadmult + " "
		$app s_out, d_teaquadpart

		$out s_out
  	      fapp d_any, s_afile, s_out
	  endi

	  goto tag_nextnumber
    endi

    'test the p29,p31 duo
    d_teaquadpart = d_teaquad11part + 18
    dduo d_duofactor, d_teaquadpart, d_teaquadmult
    dift d_duofactor <> 1
	  dift d_duofactor <= d_maxarrayprime
		s_out = "duofactor=" + d_duofactor
		$app s_out, " less than=" + d_maxarrayprime
		$app s_out, " num=" + d_teaquadmult + " "
		$app s_out, d_teaquadpart

		$out s_out
  	      fapp d_any, s_afile, s_out
	  endi

	  goto tag_nextnumber
    endi

    'test the p41,p43 duo
    d_teaquadpart = d_teaquad11part + 30
    dduo d_duofactor, d_teaquadpart, d_teaquadmult
    dift d_duofactor <> 1
	  dift d_duofactor <= d_maxarrayprime
		s_out = "duofactor=" + d_duofactor
		$app s_out, " less than=" + d_maxarrayprime
		$app s_out, " num=" + d_teaquadmult + " "
		$app s_out, d_teaquadpart

		$out s_out
  	      fapp d_any, s_afile, s_out
	  endi

	  goto tag_nextnumber
    endi
					 	
    'test the p47,p49 duo
    d_teaquadpart = d_teaquad11part + 36
    dduo d_duofactor, d_teaquadpart, d_teaquadmult
    dift d_duofactor <> 1
	  dift d_duofactor <= d_maxarrayprime
		s_out = "duofactor=" + d_duofactor
		$app s_out, " less than=" + d_maxarrayprime
		$app s_out, " num=" + d_teaquadmult + " "
		$app s_out, d_teaquadpart

		$out s_out
  	      fapp d_any, s_afile, s_out
	  endi

	  goto tag_nextnumber
    endi

    'get test seconds in d_quadsec2 and round to integer
    dsec d_quadsec2
    d_quadsec3 = d_quadsec2 - d_quadsec1 \ 1
    'for Suse 9.3
    dift d_quadsec3 > 99999: d_quadsec3 = d_quadsec3 \ 10000

    'we have a teaquad 5TP39
    dinc d_qtpcount

    dg_pass1 = d_teaquad11part
    dg_pass2 = d_teaquadmult
    sub_teaquad_to_string
    s_primetest = sg_pass1

    'show the just found 5TP39
    $dat s_datenow
    $cut s_datenow, s_datenow, 1, 17

    s_out = "] 000:5TP39= " + s_primetest + " " + s_datenow 
    $app s_out, " " + d_quadsec3 + " " + s_2code
    $app s_out, " " + d_qtpcount
    $out s_out

    fapp d_any, s_afile, s_out
    dbad d_any = 0

    fapp d_any, s_bfile, s_out
    dbad d_any = 0

    fapp d_any, s_afile, s_primetest
    dbad d_any = 0

    dift d_test = 1
	  dift d_qtpcount >= 1
		dsec d_any
		d_any = d_any - d_begseconds
		$out "seconds=" + d_any

		$inp s_any, "stop"
		goto tag_endsubr
	  endi
    endi

    goto tag_nextnumber
endi
gtag tag_endsubr
ends sub_teaquad_5tp39_by_modulus_duo


subr sub_5tp39_two_files_compare
'updated 2008/12/22, 2008/12/09, 2007/12/13
'2007/12/10, 2007/10/27, 2007/10/23, 2007/10/04, 2007/08/26
'2007/07/31, 2006/07/28, 2006/02/25, 2005/10/15, 2004/05/11
    vari d_any, s_any, d_dot, s_dot, s_out
    vari s_filename1, s_filedata1, s_filename2, s_filedata2
    vari d_process, d_loop, d_big, d_ctlines, d_ctskipped
    vari d_ctfound, d_ctnotfound, s_prev5tp39, s_dashes
    vari s_5tp39, s_lookstring, d_matchupfile, d_nostop
    vari d_ctdata1, d_ctdata2, d_cte15

    $ch$ s_dashes, "-", 50
    d_process = 1
    dift d_process = 1
        $out "5tp39s in file1 are looked up in file2"
        $inp s_filename1, "enter filename1"
	  $ift s_filename1 = "*": dinc d_process
    endi
    dift d_process = 1
        $inp s_filename2, "enter filename2"
	  $ift s_filename2 = "*": dinc d_process
    endi
    dift d_process = 1
        finp s_filedata1, s_filename1
        finp s_filedata2, s_filename2

        $bes s_filedata1, s_filedata1
        $bes s_filedata2, s_filedata2

        $cup s_filedata1, s_filedata1
        $cup s_filedata2, s_filedata2

        s_lookstring = "5TP39="
        $cnt d_ctdata1, s_filedata1, s_lookstring
        $cnt d_ctdata2, s_filedata2, s_lookstring

        $len d_any, s_filedata1
        s_out = s_filename1 + ", length=" + d_any
        $app s_out, ", count=" + d_ctdata1
        $out s_out
        dift d_any = 0: dinc d_process
    endi
    dift d_process = 1
        $len d_any, s_filedata2
        s_out = s_filename2 + ", length=" + d_any
        $app s_out, ", count=" + d_ctdata2
        $out s_out
        dift d_any = 0: dinc d_process
    endi
    dift d_process = 1
	  $inp s_any, "1=make new no find file=matchup.txt"
	  $ift s_any = "*": dinc d_process
	  d_matchupfile = 2
	  $ift s_any = "1"
		d_matchupfile = 1
		fdel d_any, "matchup.txt"
	  endi
    endi
    dift d_process = 1
	  $inp s_any, "1=no stop"
	  $ift s_any = "*": dinc d_process
	  d_nostop = 2
	  $ift s_any = "1": d_nostop = 1	 
    endi
    dift d_process = 1
        $out "from " + s_filename1 + " looking in " + s_filename2
	  $inp s_any, "return to begin"
	  $ift s_any = "*": dinc d_process
    endi

    d_cte15 = 0
    d_ctskipped = 0
    d_ctdata1 = 0
    d_ctfound = 0
    d_ctnotfound = 0
    d_ctlines = 0
    dpow d_big, 10, 10

    d_loop = d_process

    dwhi d_loop = 1
        's_lookstring is "5TP39="
	  $lok d_dot, s_filedata1, 1, s_lookstring	  

	  dift d_dot = 0
		'no more are in s_filedata1
	      dinc d_loop
	  else
		'we found a s_lookstring in s_filedata1

		'tell
		dinc d_ctdata1
		d_any = d_ctdata1 % 100
		dift d_any = 0: $sho d_ctdata1

		'5TP39=^ 
		'0123456
		d_dot = d_dot + 6
		$cut s_filedata1, s_filedata1, d_dot, d_big
		$trb s_filedata1, s_filedata1

		$lok d_dot, s_filedata1, 1, " "
		$cut s_5tp39, s_filedata1, 1, d_dot
		$trb s_5tp39, s_5tp39

		' 12345678901234567890
		'1,234,567,890,123,456
		$len d_any, s_5tp39
		dift d_any > 20
		    'output dash line between quadrillions
		    d_any = d_any - 20
		    $cut s_any, s_5tp39, 1, d_any
		    $cut s_dot, s_prev5tp39, 1, d_any
		    $ift s_any <> s_dot
			  s_out = d_cte15 + " " + s_dot
			  $app s_out, "E15" + s_dashes
			  $out s_out

		        dift d_matchupfile = 1
			      fapp d_any, "matchup.txt", s_out
			      dbad d_any = 0
		        endi

			  d_cte15 = 0
		    endi
		endi

		'increment count per e15
		dinc d_cte15

		s_prev5tp39 = s_5tp39

		s_5tp39 = "5TP39= " + s_5tp39 + " "

		'is it in s_filedata2
		$lok d_dot, s_filedata2, 1, s_5tp39

		dift d_dot > 0
		    'in both
		    dinc d_ctfound

		    dift d_ctskipped > 0
			  dift d_ctskipped < 20
				s_any = " count of skipped=" + d_ctskipped
			      $out s_5tp39 + s_any 
				$inp s_any, "return"
			      $ift s_any = "*": dinc d_loop
			  endi
		    endi
		    d_ctskipped = 0
		else
		    'not found in s_filedata2
		    dinc d_ctskipped
		    dinc d_ctnotfound

		    s_out = d_ctnotfound
	          $app s_out, ". " + s_5tp39
	          '$app s_out, " in " + s_filename1
	          '$app s_out, " but not in " + s_filename2
	          $out s_out

		    dift d_matchupfile = 1
			  fapp d_any, "matchup.txt", s_out
			  dbad d_any = 0
		    endi

		    'stop every 20 lines unless d_nostop=1
		    dift d_nostop = 1: d_ctlines = 0
	          dinc d_ctlines
	          dift d_ctlines >= 20
	              d_ctlines = 0
	              $inp s_any, "more"
			  $ift s_any = "*": dinc d_loop
	          endi
		endi
	  endi
    endw

    $out "found=" + d_ctfound + ", not=" + d_ctnotfound

    sub_path_prog_memory

    $inp s_any, "done"    
ends sub_5tp39_two_files_compare


subr sub_5tp39_validate_in_a_file
'updated 2006/11/24, 2006/08/04, 2006/07/19
'2006/03/08, 2006/03/07, 2006/03/06, 2006/02/25, 2005/06/09
'2005/05/19, 2005/05/02, 2005/05/01, 2005/04/29, 2005/04/20
'2005/04/19, 2005/04/08, 2005/03/31, 2005/03/07, 2005/03/06
    vari d_any, s_any, d_dot, s_dot, s_tap, s_out
    vari d_filebyte, s_record, s_filename, d_loop, d_good
    vari s_number, d_number, d_seconds, d_begin, d_count
    vari d_yestest, d_process, d_findclosetwin, d_true
    vari d_3cluster, d_1hold, d_2hold, d_diff
    vari d_largegap, d_smallgap
    vari d_ypivcom, d_pivcom, s_factors

    $sys s_any, 2
    $out s_any

    d_process = 1
    dift d_process = 1
        $inp s_any, "1=do not test for 5TP39, default=do test"
        $ift s_any = "*": dinc d_process
        d_yestest = 1
        $ift s_any = "1": dinc d_yestest
    endi
    dift d_process = 1
        $inp s_any, "enter number to begin, default = 6.4*10^15"
        $ift s_any = "*": dinc d_process
        $tod d_begin, "6,400,000,000,000,000"
        $isd d_any, s_any
        dift d_any = 1: $tod d_begin, s_any
    endi
    dift d_process = 1
	  d_ypivcom = 2
	  $inp s_any, "1=pivcom factors"
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "1": d_ypivcom = 1
    endi
    dift d_process = 1
        $inp s_any, "enter amount for a 3cluster, default=0"
        $ift s_any = "*": dinc d_process
        d_3cluster = 0
        $isd d_any, s_any
        dift d_any = 1: $tod d_3cluster, s_any
    endi
    dift d_process = 1
        d_largegap = 0
        $inp s_any, "1 = large gap of 15*10^12 or enter other"
        $ift s_any = "*": dinc d_process
        $ift s_any = "1": s_any = "15,000,000,000,000"
        $isd d_any, s_any
        dift d_any = 1: $tod d_largegap, s_any
    endi
    dift d_process = 1
        d_smallgap = 0
        $inp s_any, "1 = small gap of 5*10^9 or enter other"
        $ift s_any = "*": dinc d_process
        $ift s_any = "1": s_any = "5,000,000,000"
        $isd d_any, s_any
        dift d_any = 1: $tod d_smallgap, s_any

        $out "3cluster=" + d_3cluster
        s_filename = "fix5tp39.exp"
        $out "input file=" + s_filename
    endi
    dift d_process = 1
	  d_findclosetwin = 0
	  $inp s_any, "1 = find close twin"
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "1": d_findclosetwin = 1
    endi

    d_count = 0
    d_filebyte = 1
    d_loop = d_process
    dwhi d_loop = 1
	  d_good = 1
	  fsip s_record, s_filename, d_filebyte
	  dift d_filebyte = 0
		dinc d_good
		dinc d_loop
	  endi
	  dift d_good = 1
		$lok d_dot, s_record, 1, "5TP39="
		dift d_dot = 0: dinc d_good
	  endi
	  dift d_good = 1
		'5TP39= 39,713...
		d_dot = d_dot + 7
		$lok d_any, s_record, d_dot, " "
		d_any = d_any - d_dot + 1
		$cut s_number, s_record, d_dot, d_any
		$trb s_number, s_number
		$isd d_any, s_number
		dift d_any <> 1
		    $inp s_any, "bad number=" + s_number
		    $ift s_any = "*": dinc d_loop
		    dinc d_good
		endi
	  endi
	  dift d_good = 1
		$tod d_number, s_number

		'skip if before beginning
		dift d_number < d_begin: dinc d_good
	  endi
	  dift d_good = 1
		dift d_yestest = 1
		    dg_pass1 = d_number
		    sub_5tp39_test
		    d_true = dg_pass2
		    d_seconds = dg_pass3
		else
		    d_true = 1
		    d_seconds = 0
		endi
dift d_findclosetwin = 1
    dift d_true = 1		
        'find close twin
        dg_pass1 = d_number + 38
        dg_pass2 = 2
        sub_find_close_twin
        dg_pass1 = d_number
        dg_pass2 = -2
        sub_find_close_twin
    endi
endi
		dift d_true <> 1
		    'do not have 5TP39
		    $inp s_any, "not 5TP39= " + s_number
		    $ift s_any = "*": dinc d_loop
		else
		    'have 5TP39
		    dinc d_count

		    s_factors = sg_nothing
		    dift d_ypivcom = 1
			  d_dot = d_number + 19 \ 210
			  dfac d_any, d_dot
			  $app s_factors, ",pfac=" + d_any
		    endi

		    s_out = d_count + ". 5TP39= " + s_number
		    $app s_out, " secs= " + d_seconds
		    $app s_out, " " + s_factors
		    $out s_out

		    'small gap
		    dift d_smallgap > 0
			  d_diff = d_number - d_1hold
			  dift d_diff < d_smallgap
				ded$ s_any, d_number,0 ,0
				ded$ s_dot, d_1hold, 0, 0			 
				ded$ s_tap, d_diff, 0, 0
				s_out = "small gap: " + s_any
				$app s_out, ", " + s_dot
				$app s_out, " of " + s_tap
				$inp s_any, s_out
			  endi
		    endi

		    'large gap
		    dift d_largegap > 0
			  d_diff = d_number - d_1hold
			  dift d_diff > d_largegap
				ded$ s_any, d_1hold, 0, 0			 
				$out "large gap: " + s_any

				ded$ s_any, d_number,0 ,0
				$out "large gap: " + s_any

				ded$ s_any, d_diff, 0, 0
				$out "diff: " + s_any

				$inp s_any, "more"
				$ift s_any = "*": dinc d_loop
			  endi
		    endi

		    '3cluster
		    dift d_3cluster > 0
			  d_diff = d_number - d_2hold
			  dift d_diff < d_3cluster
				ded$ s_any, d_2hold, 0, 0
				$out "3cluster=" + s_any

				ded$ s_any, d_1hold, 0, 0
				$out "3cluster=" + s_any

				ded$ s_any, d_number, 0, 0
				$out "3cluster=" + s_any

				ded$ s_any, d_diff, 0, 0
				$out "difference=" + s_any

				$inp s_any, "3cluster, * to end"
				$ift s_any = "*": dinc d_loop
			  endi
		    endi

		    d_2hold = d_1hold
		    d_1hold = d_number
		endi
	  endi
    endw

    $inp s_any, "count=" + d_count
ends sub_5tp39_validate_in_a_file


subr sub_5tp39_rolling_test_primes
'updated 2007/07/08, 2007/07/07, 2007/07/06
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_process, d_yes, s_bads, s_goods
    vari d_num, d_mod, d_test, d_count1, d_count2
    vari d_p11, d_p13, d_p17, d_p19, d_p29
    vari d_p31, d_p41, d_p43, d_p47, d_p49

    '71,525,244,611 is the third 5tp39
    d_p11 = 71525244611
    d_p13 = d_p11 + 2
    d_p17 = d_p11 + 6
    d_p19 = d_p11 + 8
    d_p29 = d_p11 + 18
    d_p31 = d_p11 + 20
    d_p41 = d_p11 + 30
    d_p43 = d_p11 + 32
    d_p47 = d_p11 + 36
    d_p49 = d_p11 + 38

    d_process = 1
    dift d_process = 1
        $inp s_any, "enter test number ie. 17, 19"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_num, s_any
    endi
    s_bads = sg_nothing
    s_goods = sg_nothing

    dift d_process = 1
	  d_mod = 0
	  dwhi d_mod < d_num
		d_test = d_p49 - d_mod
		d_yes = 1
		dift d_mod = 0: dinc d_yes
		dift d_test = d_p11: dinc d_yes
		dift d_test = d_p13: dinc d_yes
		dift d_test = d_p17: dinc d_yes
		dift d_test = d_p19: dinc d_yes
		dift d_test = d_p29: dinc d_yes
		dift d_test = d_p31: dinc d_yes
		dift d_test = d_p41: dinc d_yes
		dift d_test = d_p43: dinc d_yes
		dift d_test = d_p47: dinc d_yes
		dift d_test = d_p49: dinc d_yes

		d_test = d_test - d_num
		dift d_test = d_p11: dinc d_yes
		dift d_test = d_p13: dinc d_yes
		dift d_test = d_p17: dinc d_yes
		dift d_test = d_p19: dinc d_yes
		dift d_test = d_p29: dinc d_yes
		dift d_test = d_p31: dinc d_yes
		dift d_test = d_p41: dinc d_yes
		dift d_test = d_p43: dinc d_yes
		dift d_test = d_p47: dinc d_yes
		dift d_test = d_p49: dinc d_yes

		d_test = d_test - d_num
		dift d_test = d_p11: dinc d_yes
		dift d_test = d_p13: dinc d_yes
		dift d_test = d_p17: dinc d_yes
		dift d_test = d_p19: dinc d_yes
		dift d_test = d_p29: dinc d_yes
		dift d_test = d_p31: dinc d_yes
		dift d_test = d_p41: dinc d_yes
		dift d_test = d_p43: dinc d_yes
		dift d_test = d_p47: dinc d_yes
		dift d_test = d_p49: dinc d_yes

		d_test = d_test - d_num
		dift d_test = d_p11: dinc d_yes
		dift d_test = d_p13: dinc d_yes
		dift d_test = d_p17: dinc d_yes
		dift d_test = d_p19: dinc d_yes
		dift d_test = d_p29: dinc d_yes
		dift d_test = d_p31: dinc d_yes
		dift d_test = d_p41: dinc d_yes
		dift d_test = d_p43: dinc d_yes
		dift d_test = d_p47: dinc d_yes
		dift d_test = d_p49: dinc d_yes

		dift d_yes = 1: $app s_goods, d_mod + " "
		dift d_yes <> 1: $app s_bads, d_mod + " "

		s_out = "number=" + d_num + " mod=" + d_mod + " result="
		dift d_yes = 1: $app s_out, " yes"
		dift d_yes <> 1: $app s_out, " no"
		$out s_out

		dift d_yes = 1: dinc d_count1
		dift d_yes <> 1: dinc d_count2
		dinc d_mod
		'dg_pass1 = d_mod
		'sub_next_prime
		'd_mod = dg_pass1
	  endw
    endi

    $out "bad mods=" + s_bads
    $out "good mods=" + s_goods

    dpow d_any, 10, 15
    d_any = d_any % d_num
    $out "10^15%" + d_num + "=" + d_any

    $inp s_any, "done, yes=" + d_count1 + " no=" + d_count2
ends sub_5tp39_rolling_test_primes


subr sub_next_prime
'updated 2007/07/06
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_number, d_loop

    d_number = dg_pass1 + 1

    d_any = d_number % 2
    dift d_any = 0: dinc d_number

    d_loop = 1
    dwhi d_loop = 1
	  dfac d_any, d_number
	  dift d_any = 1
		dinc d_loop
	  else
		d_number = d_number + 2
	  endi
    endw

    dg_pass1 = d_number
ends sub_next_prime


subr sub_find_close_twin
'updated 2006/04/05, 2006/03/08, 2006/03/07
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_number0, d_number1, d_number2, d_factor
    vari s_number0, d_loop, d_delta, d_2delta

    d_number0 = dg_pass1

    d_delta = dg_pass2
    dift d_delta <> -2: d_delta = 2
    d_2delta = 2 * d_delta

    d_number1 = d_number0 + d_delta

    d_loop = 1
    dwhi d_loop = 1
	  'find the first twin from a number
	  dfac d_factor, d_number1

	  dift d_factor = 1
		d_number2 = d_number1 + d_delta

		dfac d_factor, d_number2
		dift d_factor = 1
		    'we have a prime twin
		    ded$ s_number0, d_number0, 0, 0
		    ded$ s_any, d_number1, 0, 0
		    d_any = d_number1 - d_number0
		    s_out = "5TP39=" + s_number0 + ", twin="
		    $app s_out, s_any + ", diff=" + d_any
		    $out s_out

		    fapp d_any, "twins.txt", s_out
		    dbad d_any = 0

		    dinc d_loop
		else
		    d_number1 = d_number1 + d_2delta
		endi
	  else
		dift d_factor = 2: dinc d_loop
		d_number1 = d_number1 + d_delta		
	  endi

	  'no use going too far
	  d_any = d_number1 - d_number0
	  dabs d_any, d_any
	  dift d_any > 23: dinc d_loop
    endw
ends sub_find_close_twin


subr sub_5tp39_factors
'updated 2005/05/02
'factors of dg_pass1 into sg_pass1
    vari d_any, s_any, d_dot, s_dot
    vari d_number, d_factor, s_result
    vari d_good, d_loop

    d_number = dg_pass1 / 210
    s_result = sg_nothing

    d_loop = 1
    dwhi d_loop = 1
	  dfac d_factor, d_number
	  $app s_result, "," + d_factor

	  dift d_factor > 1
		d_number = d_number / d_factor
	  else
		dinc d_loop
	  endi
    endw
    sg_pass1 = s_result
ends sub_5tp39_pivcom_factors


subr sub_5tp39_test
'updated 2005/03/06
    vari d_any, s_any, d_dot, s_dot
    vari d_number, d_good, d_seconds

    dsec d_seconds

    '11,13,17,19,29,31,41,43,47,49
    d_number = dg_pass1
    dfac d_good, d_number

    d_any = d_number + 2
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 6
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 8
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 18
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 20
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 30
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 32
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 36
    dift d_good = 1: dfac d_good, d_any

    d_any = d_number + 38
    dift d_good = 1: dfac d_good, d_any

    dsec d_any

    dg_pass2 = d_good		
    dg_pass3 = d_any - d_seconds
ends sub_5tp39_test


subr sub_teaquad_5tp39_test_a_number_duo
'updated 2008/12/06, 2007/12/01, 2007/09/06
'2007/02/25, 2006/07/29, 2005/07/23, 2005/05/01, 2005/04/17
'2005/04/14, 2005/03/31, 2005/03/27, 2005/03/18, 2005/03/16
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_process, d_loop, d_factor, s_dashes, d_yes, d_count
    vari s_number, d_number, d_trynum, s_trynum
    vari d_seconds1, d_seconds2, d_seconds3
    vari d_teaquadpart, d_teaquadmult
    vari d_tryteaquadpart, d_tryteaquadmult

    $sys s_any, 2
    $out s_any

    $ch$ s_dashes, "-", 70
    d_process = 1
    
    d_loop = d_process
    dwhi d_loop = 1
	  $out s_dashes
	  $out "1. 5TP39= 39,713,433,671"
	  $out "2. 5TP39= 1,943,372,747,435,261"
	  $out "3. 5TP39= 1,943,381,207,047,331"
	  $out "25. 5TP39= 13,069,672,451,845,151"
	  $out "99. 5TP39= 99,996,530,453,619,851"
	  $inp s_number, "enter the first number of a 5TP39"
	  $ift s_number = "*"
		dinc d_loop
		dinc d_process
	  endi
	  $ift s_number = "1": s_number = "39,713,433,671"
	  $ift s_number = "2": s_number = "1,943,372,747,435,261"
	  $ift s_number = "3": s_number = "1,943,381,207,047,331"
	  $ift s_number = "25": s_number = "13,069,672,451,845,151"
	  $ift s_number = "99": s_number = "99,996,530,453,619,851"

        dift d_process = 1
	      $out s_number 
	      sg_pass1 = s_number
	      sub_teaquad_from_string
	      d_teaquadpart = dg_pass1
	      d_teaquadmult = dg_pass2

		ded$ s_any, d_teaquadpart, 0, 0
	      $out "d_teaquadpart=" + s_any

		ded$ s_any, d_teaquadmult, 0, 0
	      $out "d_teaquadmult=" + s_any
        endi

	  dift d_process = 1
		d_count = 0
		d_yes = 1

		dsec d_seconds1

		'11,13
		dinc d_count
		d_tryteaquadpart = d_teaquadpart
		d_tryteaquadmult = d_teaquadmult
		dg_pass1 = d_tryteaquadpart
		dg_pass2 = d_tryteaquadmult
		sub_teaquad_to_string
		s_trynum = d_count + "=" + " " + sg_pass1

		dsec d_seconds2
		dduo d_factor, d_tryteaquadpart, d_tryteaquadmult
		dsec d_seconds3

	      dift d_factor = 1
		    s_out = s_trynum + " is prime"	
	      else
		    ded$ s_any, d_factor, 0, 0
		    s_out = s_trynum + " is not prime, " + s_any	
		    dinc d_yes
	      endi
		d_seconds3 = d_seconds3 - d_seconds2
		$out s_out + " sec=" + d_seconds3

		'17,19
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 6
		d_tryteaquadmult = d_teaquadmult
		dg_pass1 = d_tryteaquadpart
		dg_pass2 = d_tryteaquadmult
		sub_teaquad_to_string
		s_trynum = d_count + "=" + " " + sg_pass1

		dsec d_seconds2
		dduo d_factor, d_tryteaquadpart, d_tryteaquadmult
		dsec d_seconds3
	      dift d_factor = 1
		    s_out = s_trynum + " is prime"	
	      else
		    ded$ s_any, d_factor, 0, 0
		    s_out = s_trynum + " is not prime, " + s_any	
		    dinc d_yes
	      endi
		d_seconds3 = d_seconds3 - d_seconds2
		$out s_out + " sec=" + d_seconds3

		'29,31
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 18
		d_tryteaquadmult = d_teaquadmult
		dg_pass1 = d_tryteaquadpart
		dg_pass2 = d_tryteaquadmult
		sub_teaquad_to_string
		s_trynum = d_count + "=" + " " + sg_pass1

		dsec d_seconds2
		dduo d_factor, d_tryteaquadpart, d_tryteaquadmult
		dsec d_seconds3
	      dift d_factor = 1
		    s_out = s_trynum + " is prime"	
	      else
		    ded$ s_any, d_factor, 0, 0
		    s_out = s_trynum + " is not prime, " + s_any	
		    dinc d_yes
	      endi
		d_seconds3 = d_seconds3 - d_seconds2
		$out s_out + " sec=" + d_seconds3

		'41,43
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 30
		d_tryteaquadmult = d_teaquadmult
		dg_pass1 = d_tryteaquadpart
		dg_pass2 = d_tryteaquadmult
		sub_teaquad_to_string
		s_trynum = d_count + "=" + " " + sg_pass1

		dsec d_seconds2
		dduo d_factor, d_tryteaquadpart, d_tryteaquadmult
		dsec d_seconds3
	      dift d_factor = 1
		    s_out = s_trynum + " is prime"	
	      else
		    ded$ s_any, d_factor, 0, 0
		    s_out = s_trynum + " is not prime, " + s_any	
		    dinc d_yes
	      endi
		d_seconds3 = d_seconds3 - d_seconds2
		$out s_out + " sec=" + d_seconds3

		'47,49
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 36
		d_tryteaquadmult = d_teaquadmult
		dg_pass1 = d_tryteaquadpart
		dg_pass2 = d_tryteaquadmult
		sub_teaquad_to_string
		s_trynum = d_count + "=" + " " + sg_pass1

		dsec d_seconds2
		dduo d_factor, d_tryteaquadpart, d_tryteaquadmult
		dsec d_seconds3
	      dift d_factor = 1
		    s_out = s_trynum + " is prime"	
	      else
		    ded$ s_any, d_factor, 0, 0
		    s_out = s_trynum + " is not prime, " + s_any	
		    dinc d_yes
	      endi
		d_seconds3 = d_seconds3 - d_seconds2
		$out s_out + " sec=" + d_seconds3

		dsec d_any
		d_seconds1 = d_any - d_seconds1
		$out s_dashes

		dift d_yes = 1
		    s_any = "yes, 5TP39, number=" + s_number 		   
		    $app s_any, ", seconds=" + d_seconds1
		    $out s_any
		else
		    s_any = "not 5TP39, number=" + s_number
		    $app s_any, ", seconds=" + d_seconds1
		    $out s_any
		endi
		$inp s_any, "return"
		$ift s_any = "*": dinc d_loop
	  endi
    endw
ends sub_teaquad_5tp39_test_a_number_duo


subr sub_floating_point_accuracy
'updated 2005/03/31, 2005/03/29
    vari d_any, s_any, d_dot, s_dot
    vari d_loop, d_number, s_number, s_hold
    vari d_high, d_delta, d_random, d_totrandom
    vari d_count, d_jump

    $sys s_any, 2
    $out s_any

    d_totrandom = 0
    d_count = 0
    dpow d_jump, 10, 5
    dpow d_high, 10, 16
    dpow d_delta, 10, 13

    d_loop = 1
    dwhi d_loop = 1
	  dran d_random
	  d_totrandom = d_totrandom + d_random

	  d_number = d_high - d_delta * d_random + d_high - d_delta
	  ddec d_delta

	  d_any = d_number + 1
	  dift d_any = d_number
		dift d_number < d_high: d_high = d_number
	  endi

	  dinc d_count
	  d_any = d_count % d_jump

        dift d_any = 0
		d_any = d_totrandom / d_count

		ded$ s_any, d_count, 0, 0
		ded$ s_dot, d_high, 0, 0

		s_any = s_any + ". " + s_dot
		$app s_any, ", averan=" + d_any
		$app s_any, ", random=" + d_random
		$out s_any
	  endi
    endw
ends sub_floating_point_accuracy


subr sub_speed
'updated 2005/03/31, 2005/02/26, 2004/12/03
'speed test
    vari d_any, s_any, d_dot, s_dot
    vari d_time, d_max, d_count

    $sys s_any, 2
    $out s_any

    dsec d_time

    'ten million loop
    d_max = 1000 * 1000 * 10
    d_count = 0
    dwhi d_count < d_max
	  dinc d_count
    endw
    dsec d_any
    d_time = d_any - d_time
    ded$ s_any, d_count, 0, 0
    $out "loops=" + s_any
    $inp s_any, "ten million loop, seconds=" + d_time 
ends sub_speed


subr sub_floating_point_test
'updated 2009/03/04, 2006/07/19, 2002/10/05
    vari d_any, s_any, d_dot, s_dot
    vari s_out
   
    dpow d_any, 10, 14
    d_any = d_any / 3
    ded$ s_out, d_any, 0, 0

    s_out = "10E14/3=" + s_out

    s_any = "error: floating point: "
    $lok d_dot, s_out, 1, "."

    dift d_dot > 0
	  ddec d_dot
	  $cut s_dot, s_out, d_dot, 3
	  $ift s_dot = "3.3": s_any = "ok: floating point: "
    endi
    dsec d_any
    $out s_any + s_out + " sec=" + d_any
ends sub_floating_point_test


subr sub_prime_test_using_prime_array
'updated 2006/07/29, 2004/01/24
'test dg_pass1>3 for prime, if prime set dg_pass1 to 1
'use the indexed primes in the decimal array
    vari d_number, d_try, d_square, d_mod, d_index
    vari d_loop, d_result, d_root

    d_number = dg_pass1 \ 1
    dabs d_number, d_number
    dpow d_root, d_number, 0.5
    d_index = 1
    d_result = 1
    d_try = 3
    d_loop = 1

    dwhi d_loop = 1
	  dift d_index <= 2000
		itod d_try, d_index
		dinc d_index
	  else
		d_try = d_try + 2
	  endi

	  dift d_try > d_root
		dinc d_loop
	  else
		d_mod = d_number % d_try
		dift d_mod = 0
		    d_result = d_try
		    dinc d_loop	  
		endi
	  endi
    endw
    dg_pass1 = d_result
ends sub_prime_test_using_prime_array


subr sub_primes_build_array
'updated 2004/01/24
'put 2000 primes into the array by index
    vari s_any, d_any
    vari d_number, d_result, d_index, d_prime
    vari d_time1, d_time2

    dsec d_time1

    $out "building array of 2000 primes starting at 3 in 1"
    d_number = 3
    d_index = 1

    dwhi d_index <= 2000

	  'test d_prime to see if it is prime
	  dg_pass1 = d_number
	  sub_prime_test_simple
	  d_result = dg_pass1

	  dift d_result = 1
		d_prime = d_number
		dtoi d_index, d_number
		dinc d_index	 
	  endi

	  d_number = d_number + 2
    endw

    $out "array built of 2000 primes from 3 to " + d_prime

    dsec d_time2
    d_time2 = d_time2 - d_time1
    $out "seconds = " + d_time2
ends sub_primes_build_array


subr sub_prime_test_one_number
'updated 2006/08/04, 2006/07/29, 2004/01/01
'test individual numbers for primeness
    vari s_any, d_any, s_dot, d_dot, s_out
    vari s_pick, d_pick, s_num1, s_num2
    vari d_number, d_loop, d_good, s_xyzedited
    vari d_sec1, d_sec2, s_dashes, d_type
    vari d_tealines

    $out "1=use teapro command dfac"
    $out "2=use prime array"
    $out "3=use simple prime test"
    $inp s_any, "pick"

    d_type = 1
    $isd d_any, s_any
    dift d_any = 1: $tod d_type, s_any

    dift d_type = 2: sub_primes_build_array

    $ch$ s_dashes, "-", 70

    d_loop = 1
    dwhi d_loop = 1
	  ded$ s_any, dg_xvalue, 0, 0
	  s_xyzedited = "x=" + s_any
	  ded$ s_any, dg_yvalue, 0, 0
	  $app s_xyzedited, ", y=" + s_any
	  ded$ s_any, dg_zvalue, 0, 0
	  $app s_xyzedited, ", z=" + s_any

        $out s_dashes
	  $out " 1.           1,000,000,007"
	  $out " 2.       1,000,000,000,039"
	  $out " 3.       1,346,294,310,749"
	  $out " 4.       7,177,162,611,713"
	  $out " 5.      13,829,048,559,701"
	  $out " 6.      90,874,329,411,493"
	  $out " 7.     100,000,380,000,361 by 10,000,019"
	  $out " 8.     570,800,107,412,201"
	  $out " 9.     999,999,999,999,947"
	  $out "10.     999,999,999,999,989"
	  $out "11.   2,000,274,172,370,231"
	  $out "12.   2,276,000,138,167,961"
	  $out "13.   3,000,058,045,624,691"
	  $out "14.   6,000,993,394,600,871"
        $out "15.   9,002,235,408,655,631"
	  $out "16.   9,007,196,099,250,001 by 94,906,249"
	  $out s_xyzedited
	  $out "enter a number above or any number"
	  $inp s_pick, "enter a number to test for primeness, * to end"
	  $ift s_pick = "*": dinc d_loop

	  $tup s_pick, s_pick
	  d_pick = 0
	  $isd d_any, s_pick
	  dift d_any = 1: $tod d_pick, s_pick

	  dift d_pick = 1: s_pick = "1,000,000,007"
	  dift d_pick = 2: s_pick = "1,000,000,000,039"
	  dift d_pick = 3: s_pick = "1,346,294,310,749"
	  dift d_pick = 4: s_pick = "7,177,162,611,713"
	  dift d_pick = 5: s_pick = "13,829,048,559,701"
	  dift d_pick = 6: s_pick = "90,874,329,411,493"
	  dift d_pick = 7: s_pick = "100,000,380,000,361"
	  dift d_pick = 8: s_pick = "570,800,107,412,201"
	  dift d_pick = 9: s_pick = "999,999,999,999,947"
	  dift d_pick = 10: s_pick = "999,999,999,999,989"
	  dift d_pick = 11: s_pick = "2,000,274,172,370,231"
	  dift d_pick = 12: s_pick = "2,276,000,138,167,961"
	  dift d_pick = 13: s_pick = "3,000,058,045,624,691"
	  dift d_pick = 14: s_pick = "6,000,993,394,600,871"
	  dift d_pick = 15: s_pick = "9,002,235,408,655,631"
	  dift d_pick = 16: s_pick = "9,007,196,099,250,001"

	  $ift s_pick = "X": s_pick = dg_xvalue
	  $ift s_pick = "Y": s_pick = dg_yvalue
	  $ift s_pick = "Z": s_pick = dg_zvalue

	  $isd d_any, s_pick

	  dift d_any = 1
		$out s_dashes
		
		$tod d_number, s_pick
		ded$ s_num1, d_number, 0, 0
		$out s_num1

		'save total lines
		dsys d_tealines, 2

		dsec d_sec1

		dift d_type = 1
		    $out "using dfac"
		    dfac d_good, d_number
		endi
		dift d_type = 2
		    $out "using prime array"
	          dg_pass1 = d_number
	          sub_prime_test_using_prime_array
	          d_good = dg_pass1
		endi
		dift d_type = 3
		    $out "using simple"
	          dg_pass1 = d_number
	          sub_prime_test_simple
	          d_good = dg_pass1
		endi

		dsec d_sec2

		'get total lines
		dsys d_any, 2
		d_tealines = d_any - d_tealines
		ded$ s_any, d_tealines, 0, 0
		$out "total lines=" + s_any

		ded$ s_num1, d_number, 0, 0
		ded$ s_num2, d_good, 0, 0

		dift d_good = 1
		    $out s_num1 + " is prime"
		else
		    $out s_num1 + " is divisible by " + s_num2
		endi

		d_sec1 = d_sec2 - d_sec1
		$out "seconds = " + d_sec1
		$inp s_any, "return to continue"
		$ift s_any = "*": dinc d_loop
	  endi
    endw
ends sub_prime_test_one_number

                     
subr sub_prime_numbers
'updated 2006/04/10, 2005/02/12, 2005/02/01, 2004/12/03
'find prime numbers
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_nowprime, s_nowprime, d_oldprime, d_process
    vari d_begnumber, d_tofindct, d_count, d_stopnumber
    vari d_ctdiff, d_nowdiff, d_maxdiff, d_thisdiff
    vari d_yesprime, d_mod, d_yesdfac, d_yesbiggernumbers
    vari d_average, d_avetotal, d_shownumber, d_shownotprime
    vari d_showonlynewdiff, d_diffprime
    vari d_time1, d_time2, d_loop, d_totprimes
    vari d_tellseconds, d_seconds, d_yesfileout, s_fileout

    d_process = 1
    dift d_process = 1
        'get an output file name
        dran d_any
        dpow d_dot, 99999, 2
        d_any = d_dot * d_any \ 1

        s_fileout = "P" + d_any
        $cut s_fileout, s_fileout, 1, 8
        $app s_fileout, ".txt"

        $inp s_any, "1 = use teapro command DFAC"
        $ift s_any = "*": dinc d_process
        d_yesdfac = 2
        $ift s_any = "1": d_yesdfac = 1
    endi
    dift d_process = 1
        $inp s_any, "1 = output results to file = " + s_fileout
        $ift s_any = "*": dinc d_process
        d_yesfileout = 2
        $ift s_any = "1": d_yesfileout = 1
    endi
    dift d_process = 1
        $inp s_any, "1 = increase numbers otherwise decrease"
        $ift s_any = "*": dinc d_process
        d_yesbiggernumbers = 2
        $ift s_any = "1": d_yesbiggernumbers = 1
    endi
    dift d_process = 1
        $out "finding prime numbers"
        $out "the number to begin with, return=1"
        s_dot = "12345678901234567890"
        $inp s_any, s_dot
        $ift s_any = "*": dinc d_process
        $isd d_any, s_any
        d_begnumber = 1
        dift d_any = 1: $tod d_begnumber, s_any
    endi
    dift d_process = 1
        $out "enter number to stop at, return=1E16 or 1"
        $inp s_any, s_dot
        $ift s_any = "*": dinc d_process
        $isd d_any, s_any
        dift d_yesbiggernumbers = 1
	      dpow d_stopnumber, 10, 16
        else
            d_stopnumber = 1
        endi
        dift d_any = 1: $tod d_stopnumber, s_any
        ded$ s_any, d_stopnumber, 0, 0
        $out "stop number=" + s_any

        'add 1 if number is not odd
        d_any = d_begnumber % 2
        $out d_begnumber + " % 2 = " + d_any
        dift d_any = 0: dinc d_begnumber

        ded$ s_any, d_begnumber, 0, 0
        $out "starting with=" + s_any
        d_diffprime = d_begnumber
    endi
    dift d_process = 1
        $inp s_any, "enter number to find, return=1E16"
        $ift s_any = "*": dinc d_process
        $isd d_any, s_any
        dpow d_tofindct, 10, 16
        dift d_any = 1: $tod d_tofindct, s_any
        ded$ s_any, d_tofindct, 0, 0
        $out "number to find=" + s_any
    endi
    dift d_process = 1
        $inp s_any, "1=show only greater differences"
        $ift s_any = "*": dinc d_process
        d_showonlynewdiff = 2
        $ift s_any = "1": d_showonlynewdiff = 1

        d_shownumber = 2
    endi
    dift d_process = 1
        $inp s_any, "1=show number being considered"
        $ift s_any = "*": dinc d_process
        $ift s_any = "1": d_shownumber = 1
    endi
    dift d_process = 1
        d_shownotprime = 2
        $inp s_any, "1=show not primes and divisors"
        $ift s_any = "*": dinc d_process
        $ift s_any = "1": d_shownotprime = 1

        'build the decimal array to hold the first 2000 primes
        dift d_yesdfac <> 1: sub_primes_build_array
    endi

    'initialize count
    d_count = 0

    'previous prime
    dsec d_time1
    d_totprimes = 0
    d_oldprime = 0
    d_nowdiff = 1
    d_maxdiff = 0
    d_nowprime = d_begnumber
    d_ctdiff = 0
    d_loop = d_process

    'go until we have found count nfind
    dwhi d_loop = 1
	  dift d_shownumber = 1
		ded$ s_any, d_nowprime, 0, 0
		$sho s_any
	  endi

	  dift d_yesdfac = 1
		dfac d_yesprime, d_nowprime
	  else
            'is d_nowprime a prime
            dg_pass1 = d_nowprime
            sub_prime_test_using_prime_array
            d_yesprime = dg_pass1
	  endi

	  dift d_shownotprime = 1
		dift d_yesprime > 1
		    ded$ s_any, d_nowprime, 0, 0
		    ded$ s_dot, d_yesprime, 0, 0
		    $out "not=" + s_any + ", divisor=" + s_dot
		endi
	  endi

	  'if d_yesprime is 1 then we have a prime
	  dift d_yesprime = 1
		d_totprimes = d_totprimes + d_nowprime
		ded$ s_nowprime, d_nowprime, 0, 0

		'previous prime find difference
		dift d_oldprime > 0
		    d_nowdiff = d_nowprime - d_oldprime		
		    dabs d_nowdiff, d_nowdiff

		    dift d_nowdiff > d_maxdiff
			  d_diffprime = d_oldprime
			  d_maxdiff = d_nowdiff
			  dift d_showonlynewdiff = 1
				s_out = d_count + ". " + s_nowprime 

				ded$ s_any, d_maxdiff, 0, 0
				$app s_out, ", maximum gap=" + s_any 
			
				$out s_out
			  endi
		    endi

		    'averaging of the difference
		    dinc d_ctdiff
		    d_thisdiff = d_nowdiff
		    d_avetotal = d_avetotal + d_thisdiff
		    d_average = d_avetotal / d_ctdiff
		    drou d_average, d_average
		endi

		'increment count d_count
		dinc d_count

		dift d_showonlynewdiff <> 1
		    s_out = d_count + ". " + s_nowprime

		    dto$ s_any, d_thisdiff, 3, 0
		    $app s_out, " diff=" + s_any
		    $app s_out, " max=" + d_maxdiff  

		    ded$ s_any, d_diffprime, 0, 0
		    $app s_out, " at=" + s_any + " ave="
		    $app s_out, d_average

		    $out s_out
		    dift d_yesfileout = 1
			  fapp d_any, s_fileout, s_out
			  dbad d_any = 0
		    endi
		else
		    'd_showonlynewdiff = 1 here
		    dsec d_time2
		    d_any = d_time2 - d_time1
	          dift d_any > 5
		        d_time1 = d_time2
		        $sho "finding primes=" + s_nowprime
	          endi
		endi

		'save for previous prime
		d_oldprime = d_nowprime
	  endi

	  'increment by two for the next try at finding a prime
	  dift d_yesbiggernumbers = 1
            d_nowprime = d_nowprime + 2
		dift d_nowprime > d_stopnumber: dinc d_loop
	  else
		d_nowprime = d_nowprime - 2
		dift d_nowprime < d_stopnumber: dinc d_loop
	  endi
        dift d_count >= d_tofindct: dinc d_loop
    endw

    dsec d_time2
    d_any = d_time2 - d_time1
    $out "seconds=" + d_any

    ded$ s_any, d_diffprime, 0, 0
    $out "max diff=" + d_maxdiff + ", at=" + s_any

    ded$ s_any, d_totprimes, 0, 0
    $out "total of primes=" + s_any
    $inp s_any, "return"
ends sub_prime_numbers


subr sub_teaquad_prime_quads_duo
'updated 2008/12/12, 2007/03/06, 2004/10/21
'find prime number quads
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_good, s_fileout, d_tofile, d_process
    vari d_teaquadpart, d_teaquadmult
    vari d_tofindct, s_input, d_factor, s_number
    vari d_count, d_loop, s_date

    d_process = 1
    dift d_process = 1
	  s_fileout = "primquad.txt"
        d_tofile = 2
        $inp s_any, "1=output to file=" + s_fileout
	  $ift s_any = "*": dinc d_process
        $ift s_any = "1": d_tofile = 1
    endi
    dift d_process = 1
        $out "finding prime number quads"
        $out "enter the number to begin with"
        $inp s_input, "123456789012345678901"
	  $ift s_input = "*": dinc d_process
    endi
    dift d_process = 1
        dpow d_tofindct, 10, 5
        $inp s_any, "How many, default=99999"
	  $ift s_any = "*": dinc d_process
        $isd d_any, s_any
        dift d_any = 1 :$tod d_tofindct, s_any
    endi
    dift d_process = 1
	  sg_pass1 = s_input
	  sub_teaquad_from_string
	  d_teaquadpart = dg_pass1
	  d_teaquadmult = dg_pass2
    endi
    dift d_process = 1
        'make sure number ends in 1
        d_teaquadpart = d_teaquadpart \ 10 * 10 + 1

	  'do we need to adjust so that (num-11)%30=0
	  dg_pass1 = d_teaquadpart - 11
	  dg_pass2 = d_teaquadmult
	  dg_pass3 = 30
	  sub_teaquad_mod_op
	  d_dot = dg_pass1
	  d_teaquadpart = d_teaquadpart - d_dot

	  ded$ s_any, d_teaquadpart, 0, 0
	  $out "d_teaquadpart=" + s_any
	  ded$ s_any, d_teaquadmult, 0, 0
	  $out "d_teaquadmult=" + s_any
    endi

    d_count = 0
    d_loop = d_process

    dwhi d_loop = 1
	  dduo d_factor, d_teaquadpart, d_teaquadmult

	  d_any = d_teaquadpart + 6
	  dift d_factor = 1: dduo d_factor, d_any, d_teaquadmult

	  dift d_factor = 1
		'we have a new prime quad
		dinc d_count

		dg_pass1 = d_teaquadpart
		dg_pass2 = d_teaquadmult
		sub_teaquad_to_string
		s_number = sg_pass1

		$dat s_date
		$cut s_date, s_date, 1, 20

		s_out = d_count + "." + " " + s_number
		$app s_out, " " + s_date
		$out s_out

		dift d_tofile = 1
		    fapp d_any, s_fileout, s_out
		    dbad d_any = 0
		endi
	  endi
	  d_teaquadpart = d_teaquadpart + 30
        dift d_count >= d_tofindct: dinc d_loop
    endw
    $inp s_any, "return"
ends sub_teaquad_prime_quads_duo


subr sub_teaquad_mod_op
'updated 2007/03/06
    vari d_any, d_dot
    vari d_teaquadpart, d_teaquadmult, d_teaquadone
    vari d_modulus, d_divisor

    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2
    d_divisor = dg_pass3

    dpow d_teaquadone, 10, 15
    d_any = d_teaquadpart % d_divisor
    d_dot = d_teaquadone % d_divisor * d_teaquadmult
    d_modulus = d_any + d_dot % d_divisor

    dg_pass1 = d_modulus
ends sub_teaquad_mod_op


subr sub_big_pnq30s
'updated 2004/10/21
'find big prime quads
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_good, d_fileout, d_tofindct
    vari d_begin, d_count, d_loop, d_minimumtoshow, d_ynmindecline
    vari d_quadroot, s_quadroot, d_quaddiff, d_primetest
    vari d_quadold, s_quadold, d_quadnew, s_quadnew
    vari s_num1, s_num2, s_num3, s_num4

    d_fileout = 2
    $inp s_any, "1 = output to file = " + sg_fileout
    $ift s_any = "1": d_fileout = 1

    d_ynmindecline = 2
    dpow d_minimumtoshow, 10, 9
    $inp s_any, "enter minimum quad difference to show, 0=declining"
    $isd d_any, s_any
    dift d_any = 1: $tod d_minimumtoshow, s_any
    dift d_minimumtoshow = 0
	  d_ynmindecline = 1
	  dpow d_minimumtoshow, 10, 20
    endi

    $out "finding prime number quads"
    $out "enter the number to begin with"
    $inp s_any, "12345678901234567890123456789"
    $tod d_begin, s_any

    'make sure number ends in 1
    d_begin = d_begin \ 10 * 10 + 1

    ded$ s_any, d_begin, 0, 0
    $out "starting with=" + s_any

    dpow d_tofindct, 10, 9
    $inp s_any, "How many to find, hit return for a billion"
    $isd d_any, s_any
    dift d_any = 1: $tod d_tofindct, s_any

    ded$ s_any, d_tofindct, 0, 0
    $out "number to find=" + s_any
   
    'output beginning numbers to file
    ded$ s_num1, d_begin, 0, 0
    ded$ s_num2, d_tofindct, 0, 0
    $dat s_num3
    s_out = s_num3 + ", begin = " + s_num1 + " for " + s_num2
    dift d_fileout = 1
	  fapp d_any, sg_fileout, s_out
	  dbad d_any = 0
    endi

    d_count = 0
    d_quaddiff = 0

    'old and new quad
    d_quadold = 0
    d_quadnew = 0

    d_primetest = d_begin
    d_loop = 1

    'go until we have found count d_tofindct
    dwhi d_loop = 1
	  d_good = 2

	  dfac d_good, d_primetest

	  dift d_good = 1

		'is d_primetest + 2 a prime
		d_any = d_primetest + 2
	      dfac d_good, d_any
	 
	      dift d_good = 1
                ded$ s_num1, d_primetest, 0, 0
	          ded$ s_num2, d_quaddiff, 0, 0
                s_out = "prime twin=" + s_num1 
	          $app s_out, ", last quad=" + s_quadnew
	          $app s_out, ", diff=" + s_num2
	          $sho s_out

		    'is d_primetest + 6 a prime
		    d_any = d_primetest + 6
		    dfac d_good, d_any

		    dift d_good = 1
			  'is d_primetest + 8 a prime
			  d_any = d_primetest + 8
			  dfac d_good, d_any
		    endi
		endi
	  endi
	  dift d_good = 1
		'we have a new prime quad
		dinc d_count
		d_quadold = d_quadnew
		d_quadnew = d_primetest

		ded$ s_quadnew, d_quadnew, 0, 0

		'get the quad root
		dpow d_any, d_quadnew, 0.5
		d_quadroot = d_any \ 1
		ded$ s_quadroot, d_quadroot, 0, 0

 		'last difference
		d_quaddiff = d_quadnew - d_quadold
		dift d_quaddiff < 0: d_quaddiff = - d_quaddiff

		dift d_count = 1: dpow d_quaddiff, 10, 16

		dift d_quaddiff <= d_minimumtoshow
		    dift d_ynmindecline = 1: d_minimumtoshow = d_quaddiff

		    ded$ s_num1, d_quaddiff, 0, 0
		    ded$ s_num2, d_quadold, 0, 0
		    d_any = d_quadold + 8
		    ded$ s_num3, d_any, 0, 0

		    'we are show the just found quad
		    s_out = d_count + ". " + s_num1 + ", "
		    $app s_out, s_num2 + " / " + s_num3 
		    dift d_fileout = 1: $app s_out, ", " + sg_fileout

		    $out s_out
		endi

		'output to file if small
		d_any = d_quadroot / 16
		dift d_quaddiff < d_any
		    d_dot = d_quadold

		    ded$ s_num1, d_quaddiff, 0, 0
		    ded$ s_num2, d_dot, 0, 0
		    d_any = d_dot + 8
		    ded$ s_num3, d_any, 0, 0

		    'build up the record
		    $dat s_any
		    s_out = d_count + ". " + s_num1 + " at " + s_num2 
		    $app s_out, " / " + s_num3 + " " + s_any

		    dift d_fileout = 1
			  fapp d_any, sg_fileout, s_out
			  dbad d_any = 0
		    endi
		endi
	  endi

	  'increment by 10 or 30 for the next try at finding a quad prime
        dift d_count < 2
	      d_primetest = d_primetest + 10
        else
	      d_primetest = d_primetest + 30
        endi
        dift d_count >= d_tofindct: dinc d_loop
    endw
    $inp s_any, "return"
ends sub_big_pnq30s


subr sub_pnq30_by_210
'updated 2004/10/21
'find pnq30s by jumping 210
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_good, d_fileout, s_date, s_hournew, s_hourold
    vari d_begin, d_count, d_loop, d_delta
    vari d_primetest, d_first
    vari d_perhrpnq30, s_perhr

    $rep sg_fileout, 1, "Q"

    d_fileout = 2
    $inp s_any, "1 = output to file = " + sg_fileout
    $ift s_any = "1": d_fileout = 1

    d_delta = 210
    $inp s_any, "1 = decreasing numbers"
    $ift s_any = "1": d_delta = - 210

    $out "finding PNQ30s by 210"
    $out "enter the number to begin with"

    d_begin = 1
    $inp s_any, "12345678901234567890123456789"
    $isd d_any, s_any
    dift d_any = 1: $tod d_begin, s_any

    'is d_begin of the form 210 * n + d_first where n is an integer
    'find n into d_any
    $tod d_first, "1006301"
    d_any = d_begin - d_first \ 210
    ded$ s_any, d_any, 0, 0
    $out "n=" + s_any

    'find the place to begin
    d_begin = d_any * 210 + d_first

    'output beginning numbers to file
    $dat s_date
    ded$ s_any, d_begin, 0, 0
    s_out = "begin = " + s_any + " " + s_date
    $out s_out
    dift d_fileout = 1
	  fapp d_any, sg_fileout, s_out
	  dbad d_any = 0
    endi

    s_hourold = "x"
    d_perhrpnq30 = 0

    d_count = 0
    d_primetest = d_begin
    d_loop = 1

    'go until we stop
    dwhi d_loop = 1
	  dfac d_good, d_primetest

	  dift d_good = 1
		'is d_primetest + 2 a prime
		d_any = d_primetest + 2
	      dfac d_good, d_any
	 
	      dift d_good = 1
		    'is d_primetest + 6 a prime
		    d_any = d_primetest + 6
		    dfac d_good, d_any

		    dift d_good = 1
			  'is d_primetest + 8 a prime
			  d_any = d_primetest + 8
			  dfac d_good, d_any

			  dift d_good = 1

	'we have a prime quadruplet
	'12345678901234567890123456789012345
	'17-DEC-2002 03:56:22 20021217035622
	$dat s_date

	'get the hour for below
	$cut s_hournew, s_date, 13, 2

	$ift s_hournew <> s_hourold
	    'get perhr change
	    d_any = d_primetest - d_perhrpnq30
	    dabs d_any, d_any
	    ded$ s_perhr, d_any, 0, 0

	    d_perhrpnq30 = d_primetest
	endi

	$cut s_date, s_date, 1, 20
	ded$ s_any, d_primetest, 0, 0
	s_out = "quad=" + s_any 
	$app s_out, " " + s_date
	$app s_out, ", pnq30ct=" + d_count
	$app s_out, ", perhr=" + s_perhr

	$ift s_hournew <> s_hourold
	    $out s_out
	    s_hourold = s_hournew

          dift d_fileout = 1
	        fapp d_any, sg_fileout, s_out
		  dbad d_any = 0
	    endi
	else
          $sho s_out
	endi
				
				'is d_primetest + 30 a prime
				d_any = d_primetest + 30
				dfac d_good, d_any

				dift d_good = 1
				    'is d_primetest + 32 a prime
				    d_any = d_primetest + 32
				    dfac d_good, d_any

				    dift d_good = 1
					  'is d_primetest + 36 a prime
					  d_any = d_primetest + 36
					  dfac d_good, d_any

					  dift d_good = 1
						'is d_primetest + 38 a prime
						d_any = d_primetest + 38
						dfac d_good, d_any
	  dift d_good = 1
		'we have a pnq30
		dinc d_count
	      ded$ s_dot, d_primetest, 0, 0

	      'show the just found pnq30
		$dat s_date
		$cut s_date, s_date, 1, 20
	      s_out = "] PNQ30= " + s_dot + "  " + s_date 
		
	      $out s_out

	      'build up the record
	      dift d_fileout = 1
		    fapp d_any, sg_fileout, s_out
		    dbad d_any = 0
		endi
	  endi
					  endi
				    endi
				endi
			  endi
		    endi
		endi
	  endi

        'change by 210
        d_primetest = d_primetest + d_delta
    endw
ends sub_pnq30_by_210


subr sub_pnq30_by_pivcom
'updated 2004/10/21
'find pnq30s by pivcom
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_good, d_fileout, s_date, s_hournew, s_hourold
    vari d_begin, d_count, d_loop, d_delta
    vari d_primetest, d_first
    vari d_perhrpnq30, s_perhr
    vari d_ctpivcom, d_pivcom, d_modulus

    $rep sg_fileout, 1, "P"

    d_fileout = 2
    $inp s_any, "1 = output to file = " + sg_fileout
    $ift s_any = "1": d_fileout = 1

    d_delta = 1
    $inp s_any, "1 = decreasing numbers"
    $ift s_any = "1": d_delta = - 1

    $out "finding PNQ30s by PIVCOM"
    $out "enter the number to begin with"

    d_begin = 1
    $inp s_any, "12345678901234567890123456789"
    $isd d_any, s_any
    dift d_any = 1: $tod d_begin, s_any

    'find d_pivcom and d_ctpivcom for d_begin
    d_ctpivcom = d_begin \ 210
    dift d_ctpivcom < 1: d_ctpivcom = 1

    $out "d_ctpivcom=" + d_ctpivcom

    'find the place to begin
    d_begin = d_ctpivcom * 210 - 19

    'output beginning numbers to file
    $dat s_date
    ded$ s_any, d_begin, 0, 0
    s_out = "ctpivcom=" + d_ctpivcom 
    $app s_out, " begin=" + s_any + " " + s_date
    $out s_out
    dift d_fileout = 1
	  fapp d_any, sg_fileout, s_out
	  dbad d_any = 0
    endi

    s_hourold = "x"
    d_perhrpnq30 = 0

    d_count = 0
    d_primetest = d_begin
    d_loop = 1

    'go until we stop
    dwhi d_loop = 1

	  'for d_ctpivcom to be good the following must be
	  d_modulus = d_ctpivcom % 11 % 3 - 1
	  dift d_modulus = 0: d_modulus = d_ctpivcom % 13
	  dift d_modulus > 0: d_modulus = d_ctpivcom % 17
	  dift d_modulus > 0: d_modulus = d_ctpivcom % 19

	  dift d_modulus > 0
		d_primetest = d_ctpivcom * 210 - 19
	      dfac d_good, d_primetest
	  else
		dinc d_good
	  endi

	  dift d_good = 1
		'is d_primetest + 2 a prime
		d_any = d_primetest + 2
	      dfac d_good, d_any
	 
	      dift d_good = 1
		    'is d_primetest + 6 a prime
		    d_any = d_primetest + 6
		    dfac d_good, d_any

		    dift d_good = 1
			  'is d_primetest + 8 a prime
			  d_any = d_primetest + 8
			  dfac d_good, d_any

			  dift d_good = 1

	'we have a prime quadruplet
	'12345678901234567890123456789012345
	'17-DEC-2002 03:56:22 20021217035622
	$dat s_date

	'get the hour for below
	$cut s_hournew, s_date, 13, 2

	$ift s_hournew <> s_hourold
	    'get perhr change
	    d_any = d_primetest - d_perhrpnq30
	    dabs d_any, d_any
	    ded$ s_perhr, d_any, 0, 0

	    d_perhrpnq30 = d_primetest
	endi

	$cut s_date, s_date, 1, 20
	ded$ s_any, d_primetest, 0, 0
	s_out = "quad=" + s_any 
	$app s_out, " " + s_date
	$app s_out, ", pnq30ct=" + d_count
	$app s_out, ", perhr=" + s_perhr

	$ift s_hournew <> s_hourold
	    $out s_out
	    s_hourold = s_hournew

          dift d_fileout = 1
	        fapp d_any, sg_fileout, s_out
		  dbad d_any = 0
	    endi
	else
          $sho s_out
	endi
				
				'is d_primetest + 30 a prime
				d_any = d_primetest + 30
				dfac d_good, d_any

				dift d_good = 1
				    'is d_primetest + 32 a prime
				    d_any = d_primetest + 32
				    dfac d_good, d_any

				    dift d_good = 1
					  'is d_primetest + 36 a prime
					  d_any = d_primetest + 36
					  dfac d_good, d_any

					  dift d_good = 1
						'is d_primetest + 38 a prime
						d_any = d_primetest + 38
						dfac d_good, d_any
	  dift d_good = 1
		'we have a pnq30
		dinc d_count
	      ded$ s_dot, d_primetest, 0, 0

	      'show the just found pnq30
		$dat s_date
		$cut s_date, s_date, 1, 20
	      s_out = "] PNQ30= " + s_dot + "  " + s_date 
		
	      $out s_out

	      'build up the record
	      dift d_fileout = 1
		    fapp d_any, sg_fileout, s_out
		    dbad d_any = 0
		endi
	  endi
					  endi
				    endi
				endi
			  endi
		    endi
		endi
	  endi

        'increment the count pivcom d_ctpivcom
        d_ctpivcom = d_ctpivcom + d_delta
    endw
ends sub_pnq30_by_pivcom


subr sub_pnq30_by_modulus
'updated 2005/10/23, 2005/10/22, 2005/10/19, 2004/10/21
'find pnq30s by modulus
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_good, d_fileout, s_date, s_hournew, s_hourold
    vari d_begin, d_loop, d_which
    vari s_tfile, s_pfile, d_filebyte, s_record
    vari d_primetest, s_primetest, d_first
    vari d_perhrpnq30, s_perhr
    vari d_pivcom, s_pivcom, d_modulus, s_5tp39
    vari d_number, d_index, d_around, d_divisor

    'd_which=1 for enter beginning number
    'd_which=2 for begin again get number from file
    d_which = dg_pass1

    s_tfile = "tpnq30.txt"
    s_pfile = "ppnq30.txt"

    dift d_which = 1
	  'enter beginning number
        $out "beginning number"
        $inp s_any, "123456789012345678901"
        d_begin = 99999
        $isd d_any, s_any
        dift d_any = 1: $tod d_begin, s_any
    endi

    dift d_which = 2
	  'get beginning number from file
	  d_begin = 0
	  d_filebyte = 1
	  d_loop = 1
	  dwhi d_loop = 1
		fsip s_record, s_tfile, d_filebyte
		dift d_filebyte = 0
		    dinc d_loop
		else
		    $lok d_any, s_record, 1, " "
		    $cut s_any, s_record, 1, d_any
		    $trb s_any, s_any
		    $isd d_any, s_any
		    dift d_any = 1
			  $tod d_begin, s_any
			  $out s_any
		    else
			  $out s_record
		    endi
		endi	 
	  endw
    endi

    'the term PIVCOM was invented by Roger Hargrave in 2002
    'find d_pivcom for d_begin
    d_pivcom = d_begin \ 210 * 210
    dift d_pivcom < 210: d_pivcom = 210

    ded$ s_pivcom, d_pivcom, 0, 0
    $out "d_pivcom=" + s_pivcom

    'find the place to begin
    d_begin = d_pivcom - 19

    'output beginning numbers to file
    $dat s_date
    $cut s_date, s_date, 1, 20

    s_out = "pivcom=" + s_pivcom 

    ded$ s_any, d_begin, 0, 0
    $app s_out, " begin=" + s_any + " " + s_date

    $out s_out

    fapp d_any, s_tfile, s_out
    dbad d_any = 0

    'put primes in array
    d_number = 11
    d_index = 1
    dwhi d_index <= 2000
	  d_modulus = 99999
	  dwhi d_modulus > 1
		dfac d_modulus, d_number
		dift d_modulus > 1: d_number = d_number + 2
	  endw
	  dtoi d_index, d_number
	  d_number = d_number + 2
	  
	  dinc d_index
    endw

    s_hourold = "x"
    d_perhrpnq30 = 0

    d_primetest = d_begin
    d_loop = 1

    'go until we stop
    dwhi d_loop = 1

	  d_number = d_pivcom + 19
	  d_index = 1
	  d_around = 1
        dwhi d_around = 1
	      itod d_divisor, d_index
	      d_modulus = d_number % d_divisor

	      dift d_modulus = 0: dinc d_around
	      dift d_modulus = 2: dinc d_around
	      dift d_modulus = 6: dinc d_around
	      dift d_modulus = 8: dinc d_around
	      dift d_modulus = 30: dinc d_around
	      dift d_modulus = 32: dinc d_around
	      dift d_modulus = 36: dinc d_around
	      dift d_modulus = 38: dinc d_around

	      dinc d_index
	      dift d_index > 2000: d_around = 99999
        endw

	  dift d_around = 99999
		d_primetest = d_pivcom - 19
	      dfac d_good, d_primetest
	  else
		dinc d_good
	  endi

	  dift d_good = 1
		
		'we have a prime
		'12345678901234567890123456789012345
		'17-DEC-2002 03:56:22 20021217035622
		$dat s_date

		'get the hour for below
		$cut s_hournew, s_date, 13, 2

		$ift s_hournew <> s_hourold
		    'get perhr change
		    d_any = d_primetest - d_perhrpnq30
		    dabs d_any, d_any
		    ded$ s_perhr, d_any, 0, 0
		    s_perhr = " perhr=" + s_perhr

		    d_perhrpnq30 = d_primetest
		endi

		$cut s_date, s_date, 1, 20
		ded$ s_any, d_primetest, 0, 0
		s_out = s_any + " " + s_date

		$ift s_hournew <> s_hourold
		    $app s_out, s_perhr
		    s_hourold = s_hournew
		    fapp d_any, s_tfile, s_out
		    dbad d_any = 0

		    $out s_out
		else
		    $sho s_out
		endi

		'is d_primetest + 2 a prime
		d_any = d_primetest + 2
	      dfac d_good, d_any
	 
	      dift d_good = 1
		    'is d_primetest + 6 a prime
		    d_any = d_primetest + 6
		    dfac d_good, d_any

		    dift d_good = 1
			  'is d_primetest + 8 a prime
			  d_any = d_primetest + 8
			  dfac d_good, d_any

			  dift d_good = 1

				
				'is d_primetest + 30 a prime
				d_any = d_primetest + 30
				dfac d_good, d_any

				dift d_good = 1
				    'is d_primetest + 32 a prime
				    d_any = d_primetest + 32
				    dfac d_good, d_any

				    dift d_good = 1
					  'is d_primetest + 36 a prime
					  d_any = d_primetest + 36
					  dfac d_good, d_any

					  dift d_good = 1
						'is d_primetest + 38 a prime
						d_any = d_primetest + 38
						dfac d_good, d_any
	  dift d_good = 1
		'we have a pnq30
		'do we have a 5TP39
		s_5tp39 = sg_nothing
		d_any = d_primetest + 18
		dfac d_dot, d_any

		dift d_dot = 1
		    d_any = d_primetest + 20
		    dfac d_dot, d_any
		    dift d_dot = 1: s_5tp39 = " 5TP39"
		endi

	      ded$ s_primetest, d_primetest, 0, 0

	      'show the just found pnq30
		$dat s_date
		$cut s_date, s_date, 1, 20

	      s_out = "] 000:PNQ30= " 
		$app s_out, s_primetest 
		$app s_out, "  " + s_date 
		$app s_out, s_5tp39
		
	      $out s_out + s_perhr

	      fapp d_any, s_tfile, s_out
	      dbad d_any = 0

	      fapp d_any, s_tfile, s_primetest
	      dbad d_any = 0

	      fapp d_any, s_pfile, s_out
	      dbad d_any = 0
	  endi
					  endi
				    endi
				endi
			  endi
		    endi
		endi
	  endi

        'increment the pivcom d_pivcom
        d_pivcom = d_pivcom + 210
    endw
ends sub_pnq30_by_modulus


subr sub_getgaps_begin_again
'updated 2004/10/21
'get gaps begin again
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_oldgap, d_nowgap, d_maxgap, s_date
    vari s_fileout, d_filebyte, d_loop, s_record
    vari d_nowprime, s_nowprime
    vari d_oldprime, s_oldprime, d_yesprime
    vari d_time1, d_time2, d_time3, d_timeprime, s_timerate

    s_fileout = "gaps01.txt"
    d_oldprime = 3
    d_maxgap = 0
    d_oldgap = 0
    d_filebyte = 1
    d_loop = 1

    $inp s_any, "enter getgaps beginning number or return"
    $isd d_any, s_any
    dift d_any = 1
	  $tod d_oldprime, s_any
	  dinc d_loop
    endi

    dwhi d_loop = 1
	  'find the last number in the file to begin with
	  fsip s_record, s_fileout, d_filebyte

	  dift d_filebyte > 0
		$out s_record

		'get d_maxgap
		$lok d_dot, s_record, 1, "max="
		dift d_dot > 0
		    d_dot = d_dot + 4
		    $cut s_dot, s_record, d_dot, 9999
		    $lok d_dot, s_dot, 1, " "
		    dift d_dot > 0
			  $cut s_dot, s_dot, 1, d_dot
			  $isd d_dot, s_dot
			  dift d_dot = 1: $tod d_maxgap, s_dot
		    endi
		endi

		'get d_oldgap
		$lok d_dot, s_record, 1, "gap="
		dift d_dot > 0
		    d_dot = d_dot + 4
		    $cut s_dot, s_record, d_dot, 9999
		    $lok d_dot, s_dot, 1, " "
		    dift d_dot > 0
			  $cut s_dot, s_dot, 1, d_dot
			  $isd d_dot, s_dot
			  dift d_dot = 1: $tod d_oldgap, s_dot
		    endi
		endi

		'get d_oldprime
		$lok d_dot, s_record, 1, "prime="
		dift d_dot > 0
		    d_dot = d_dot + 6
		    $cut s_dot, s_record, d_dot, 9999
		    $trb s_dot, s_dot
		    $app s_dot, " "
		    $lok d_dot, s_dot, 1, " "
		    $cut s_dot, s_dot, 1, d_dot
		    $isd d_any, s_dot
		    dift d_any = 1: $tod d_oldprime, s_dot
		endi
	  else 
		dinc d_loop
	  endi	  
    endw

    'is d_oldprime even
    dabs d_oldprime, d_oldprime
    d_any = d_oldprime % 2
    dift d_any = 0: ddec d_oldprime

    ded$ s_oldprime, d_oldprime, 0, 0
    s_out = "max=" + d_maxgap
    $app s_out, " gap=" + d_oldgap
    $app s_out, " begin=" + s_oldprime
    $out s_out
    fapp d_any, s_fileout, s_out
    dbad d_any = 0

    d_nowprime = d_oldprime + 2
    d_timeprime = d_oldprime
    dsec d_time1
    d_time3 = d_time1 + 60

    'go until we stop
    dwhi 1 = 1
	  dfac d_yesprime, d_nowprime
	  dift d_yesprime = 1

	      dsec d_time2
	      dift d_time2 > d_time3
	          ded$ s_nowprime, d_nowprime, 0, 0

		    d_any = d_time2 - d_time1
	          d_any = d_nowprime - d_timeprime / d_any * 3600
	          ded$ s_any, d_any, 0, 0
	          s_timerate = " hr=" + s_any

	          s_out = "prime=" + s_nowprime
	          $app s_out, " max=" + d_maxgap
	          $app s_out, s_timerate
	          $sho s_out

		    'show progress every 60 seconds
	          d_timeprime = d_nowprime
		    d_time3 = d_time2 + 60
		    d_time1 = d_time2
	      endi

		'we have a new d_nowprime
		d_nowgap = d_nowprime - d_oldprime
		dift d_nowgap > d_maxgap: d_maxgap = d_nowgap

		dift d_nowgap > 200
		    ded$ s_oldprime, d_oldprime, 0, 0
		    $dat s_date
		    $cut s_date, s_date, 1, 20
		    s_out = "max=" + d_maxgap
		    $app s_out, " gap=" + d_nowgap
		    $app s_out, " prime= " + s_oldprime
		    $app s_out, " " + s_date
		    $app s_out, s_timerate
		    $out s_out

		    fapp d_any, s_fileout, s_out
		    dbad d_any = 0
		endi

		d_oldprime = d_nowprime
	  endi

        'increment d_nowprime
        d_nowprime = d_nowprime + 2
    endw
ends sub_getgaps_begin_again


subr sub_compare_dfac_and_dfak
'updated 2007/09/22
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_teaquadpart, d_teaquadone, d_teaquadmult
    vari d_dfac, d_dfak
    vari d_loop, d_seconds, d_count, d_maxcount
    vari d_process, s_number, d_number

    d_process = 1
    dift d_process = 1
	  $inp s_any, "enter number to begin"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_number, s_any
    endi
    dift d_process = 1
	  'make sure the number is odd
	  d_any = d_number % 2
	  dift d_any <> 1: dinc d_number
    endi
    dift d_process = 1
	  $inp s_any, "enter max number to compare"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  d_maxcount = 0
	  dift d_any = 1: $tod d_maxcount, s_any
    endi

    d_count = 0
    d_loop = d_process
    dwhi d_loop = 1

	  dfac d_dfac, d_number
	  dfak d_dfak, d_number, 0

	  dift d_dfac = 1: dinc d_count

	  ded$ s_any, d_dfac, 0, 0
	  ded$ s_dot, d_dfak, 0, 0
	  ded$ s_number, d_number, 0, 0

	  s_out = d_count + ". " + s_number
	  $app s_out, " dfac=" + s_any
	  $app s_out, " dfak=" + s_dot

	  dift d_dfac = d_dfak
		$app s_out, " equal"
		dift d_dfac = 1: $out s_out
	  else
		$app s_out, " not equal"
		$out s_out

		$inp s_any, "not equal"
	  endi

	  d_number = d_number + 2
	  dift d_count >= d_maxcount: dinc d_loop
    endw

    $inp s_any, "done"
ends sub_compare_dfac_and_dfak


subr sub_teaquad_primes_test_one_number
'updated 2007/07/19
'2007/03/04, 2007/02/26, 2007/02/25, 2007/02/24, 2006/12/06
'2006/11/15, 2006/11/14, 2006/11/12, 2006/11/11, 2006/10/25
'primes 9quad greater than 9E15 as total of two numbers
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_teaquadpart, d_factor, 
    vari d_loop, d_seconds, s_input, d_pick
    vari d_process, d_teaquadone, d_teaquadmult, s_default

    dpow d_teaquadone, 10, 15

    d_process = 1
    d_loop = d_process
    dwhi d_loop = 1
	  $out "1. 39,713,433,671"
	  $out "11. 6,000,000,000,000,001"
	  $out "21. 9,002,235,408,655,631"
	  $out "31. 13,086,603,727,831,391"
	  $out "41. 108,000,000,000,000,001"
	  $out "51. 999,999,999,999,999,967"
	  $out "61. 999,999,999,999,999,989"
        $inp s_input, "choose or enter number to test"

	  d_pick = 0
	  $len d_any, s_input
	  dift d_any < 4
		$isd d_any, s_input
		dift d_any = 1: $tod d_pick, s_input
	  endi

	  $ift s_input = "*"
		dinc d_process
		dinc d_loop
	  endi

        dift d_process = 1
	      dift d_pick = 1: s_input = "39,713,433,671"
	      dift d_pick = 11: s_input = "6,000,000,000,000,001"
	      dift d_pick = 21: s_input = "9,002,235,408,655,631"
	      dift d_pick = 31: s_input = "13,086,603,727,831,391"
	      dift d_pick = 41: s_input = "108,000,000,000,000,001"
	      dift d_pick = 51: s_input = "999,999,999,999,999,967"
	      dift d_pick = 61: s_input = "999,999,999,999,999,989"

	      $out s_input 
	      sg_pass1 = s_input
	      sub_teaquad_from_string
	      d_teaquadpart = dg_pass1
	      d_teaquadmult = dg_pass2

	      ded$ s_any, d_teaquadpart, 0, 0
	      $out "d_teaquadpart=" + s_any

	      ded$ s_any, d_teaquadmult, 0, 0
	      $out "d_teaquadmult=" + s_any
        endi
        dift d_process = 1
	      dsec d_seconds
	      dfak d_factor, d_teaquadpart, d_teaquadmult
	      dsec d_any

	      d_seconds = d_any - d_seconds
	      $out "seconds=" + d_seconds

	      ded$ s_any, d_teaquadpart, 0, 0
	      $out "d_teaquadpart=" + s_any

	      ded$ s_any, d_teaquadmult, 0, 0
	      $out "d_teaquadmult=" + s_any

	      ded$ s_any, d_factor, 0, 0
	      $out "d_factor=" + s_any
		$inp s_any, "return"
        endi
    endw
ends sub_teaquad_primes_test_one_number


subr sub_teaquad_primes_test_in_file
'updated 2007/07/22, 2007/07/20
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_teaquadpart, d_factor, s_number, s_aster
    vari d_loop, d_good, d_seconds, s_input, d_pick
    vari d_process, d_teaquadone, d_teaquadmult, s_default
    vari s_filename, s_record, d_filebyte
    vari d_count1, d_count2

    $ch$ s_aster, "*", 70

    d_process = 1
    dift d_process = 1
	  $inp s_filename, "enter filename"
	  $ift s_filename = "*": dinc d_process
    endi

    d_filebyte = 1
    d_loop = d_process
    dwhi d_loop = 1
	  d_good = 1
	  fsip s_record, s_filename, d_filebyte
	  dift d_filebyte = 0
		dinc d_good
		dinc d_loop
	  endi
	  dift d_good = 1
		$trb s_record, s_record
		$isd d_any, s_record
		dift d_any <> 1
		    $out "not number " + s_record
		    dinc d_good
		endi
	  endi
	  dift d_good = 1
		$out s_aster
	      $out s_record 
	      sg_pass1 = s_record
	      sub_teaquad_from_string
	      d_teaquadpart = dg_pass1
	      d_teaquadmult = dg_pass2
		sub_teaquad_to_string
		s_number = sg_pass1 

	      ded$ s_any, d_teaquadpart, 0, 0
	      $out "d_teaquadpart=" + s_any

	      ded$ s_any, d_teaquadmult, 0, 0
	      $out "d_teaquadmult=" + s_any
		$out s_number

	      dsec d_seconds
	      dfak d_factor, d_teaquadpart, d_teaquadmult
	      dsec d_any

	      d_seconds = d_any - d_seconds
		$out "seconds=" + d_seconds
		$out "factor=" + d_factor

		dift d_factor = 1
		    dinc d_count1
		    $out "prime"
		else
		    dinc d_count2
		    $inp s_any, "not prime"		    
		    $ift s_any = "*": dinc d_loop
		endi
	  endi
    endw
    $inp s_any, "primes=" + d_count1 + " not=" + d_count2
ends sub_teaquad_primes_test_in_file


subr sub_teaquad_primes_find
'updated 2007/10/07, 2007/03/04, 2007/02/24, 2007/01/07, 2007/01/06
'2006/12/11, 2006/12/09, 2006/12/08, 2006/12/07, 2006/12/06
'2006/11/27, 2006/11/25, 2006/11/13, 2006/11/12, 2006/11/11
'2006/10/29, 2006/10/28, 2006/10/27, 2006/10/26, 2006/10/25
'find primes teaquad greater than 1E15 as total of two numbers
    vari d_any, s_any, d_dot, s_dot, s_out
    vari s_number, d_teaquadpart, d_teaquadmult, d_count, s_count
    vari d_process, d_loop, d_show, d_factor, s_factor
    vari d_seconds, d_previous, d_gap, d_ctmax
    vari d_teaquadone, d_maxteaquadpart, d_maxteaquadmult
    vari d_stopteaquadpart, d_stopteaquadmult
    vari d_file, s_filename, s_date, d_factfactor
    vari d_sec1, d_sec2

    'stop for sure at 400E18
    dpow d_maxteaquadpart, 10, 15
    $tod d_maxteaquadmult, "400,000"

    d_teaquadone = d_maxteaquadpart

    d_process = 1
    dift d_process = 1
	  d_teaquadpart = 1
	  d_teaquadmult = 1
        $inp s_number, "enter begin number, default=teaquad"
	  $ift s_number = "*": dinc d_process
    endi
    dift d_process = 1
	  $trb s_number, s_number
	  $ift s_number <> sg_nothing
	      sg_pass1 = s_number
	      sub_teaquad_from_string
	      d_teaquadpart = dg_pass1
	      d_teaquadmult = dg_pass2
	  endi

        d_any = d_teaquadpart % 2
        dift d_any = 0: dinc d_teaquadpart

        ded$ s_any, d_teaquadpart, 0, 0
        $out "teaquadpart=" + s_any
        $out "teaquadmult=" + d_teaquadmult
    endi
    dift d_process = 1
	  d_show = 2
	  $inp s_any, "1=show tries"
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "1": d_show = 1
    endi
    dift d_process = 1
	  d_ctmax = 99999
	  $inp s_any, "how many to find, default=99999"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_ctmax, s_any     
    endi
    dift d_process = 1
	  d_file = 2
	  s_filename = "primes99.txt"
	  $inp s_any, "1=output to file " + s_filename
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "1"
		d_file = 1     
		flen d_any, s_filename
		dift d_any >= 0
		    $inp s_any, "1=purge old file"
		    $ift s_any = "*": dinc d_process
		    $ift s_any = "1": fdel d_any, s_filename
		endi
	  endi
    endi
    dift d_process = 1
	  d_stopteaquadpart = d_maxteaquadpart
	  d_stopteaquadmult = d_maxteaquadmult
	  $inp s_any, "enter stop number if wanted"
	  $ift s_any = "*": dinc d_process
	  
	  sg_pass1 = s_any
	  sub_teaquad_from_string
	  d_stopteaquadpart = dg_pass1
	  d_stopteaquadmult = dg_pass2
	  s_out = "stop: teaquadpart=" + d_stopteaquadpart
	  $app s_out, ", teaquadmult=" + d_stopteaquadmult
	  $out s_out
    endi

    dsec d_sec1
    d_count = 0
    d_loop = d_process
    dwhi d_loop = 1
	  dsec d_seconds

	  'use teapro command for fast method
	  dfak d_factor, d_teaquadpart, d_teaquadmult

	  dsec d_any
	  d_seconds = d_any - d_seconds

	  $dat s_date
	  $cut s_date, s_date, 1, 20

	  'is the factor prime
	  dfac d_factfactor, d_factor

        'show number just tested
        dg_pass1 = d_teaquadpart
        dg_pass2 = d_teaquadmult
        sub_teaquad_to_string
        s_number = sg_pass1

	  ded$ s_factor, d_factor, 0, 0

        'if factor is prime append ":P"
        dift d_factfactor = 1: $app s_factor, ":P"

        s_out = s_number + " " + s_date
	  $app s_out, " fact=" + s_factor
	  $app s_out, " sec=" + d_seconds
	  $sho s_out

	  dift d_show = 1
		$out s_out

	      dift d_file = 1: fapp d_any, "primes99.txt", s_out
	  endi

	  dift d_factfactor <> 1
		$out s_out
		$inp s_any, "factor not prime"
		$ift s_any = "*": dinc d_loop
	  endi

	  dift d_factor = 1
		'we have a teaquad prime
		dinc d_count
		s_count = "0000000" + d_count
		$off s_count, s_count, 7

		'find gap to previous prime
		d_gap = 0
		dift d_previous > 0: d_gap = d_teaquadpart - d_previous
		d_previous = d_teaquadpart

		dg_pass1 = d_teaquadpart
		dg_pass2 = d_teaquadmult
		sub_teaquad_to_string
		s_number = sg_pass1

	      s_out = s_count + ".prime=" + s_number
		$app s_out, " " + s_date
		$app s_out, " sec=" + d_seconds
		$app s_out, " gap=" + d_gap
	      $out s_out

		dift d_file = 1
	          s_out = "]" + " " + s_count 
		    $app s_out, ".prime=" + s_number
		    $app s_out, " " + s_date
		    $app s_out, " gap=" + d_gap

		    fapp d_any, "primes99.txt", s_out
		    dbad d_any = 0
		endi
	  endi
	 
	  d_teaquadpart = d_teaquadpart + 2
	  dift d_teaquadpart > d_teaquadone
		dinc d_teaquadmult
		d_teaquadpart = 1
	  endi

	  dift d_count >= d_ctmax: dinc d_loop

	  dift d_stopteaquadpart > 0
		dift d_teaquadmult >= d_stopteaquadmult
		    dift d_teaquadpart >= d_stopteaquadpart: dinc d_loop
		endi
	  endi

	  'cannot go over 400E18
	  dift d_teaquadmult >= d_maxteaquadmult
		dift d_teaquadpart >= d_maxteaquadpart: dinc d_loop
	  endi
    endw
    dsec d_sec2
    d_any = d_sec2 - d_sec1
    $inp s_any, "done, sec=" + d_any
ends sub_teaquad_primes_find


subr sub_9quad_prime_test
'updated 2006/10/25
'primes 9quad than 2^53 as total of two numbers
    vari d_any, s_any, d_dot, s_dot
    vari d_number1, d_number2, d_factor
    vari d_loop, d_root, d_total
    vari d_divisor, d_mod1, d_mod2, d_mod3

    d_number1 = dg_pass1
    d_number2 = dg_pass2

    d_total = d_number1 + d_number2
    dpow d_root, d_total, 0.5
    d_factor = 1
    d_divisor = 3

    d_loop = 1
    dwhi d_loop = 1
	  d_mod1 = d_number1 % d_divisor
	  d_mod2 = d_number2 % d_divisor
	  d_mod3 = d_mod1 + d_mod2 % d_divisor

	  dift d_mod3 = 0
		d_factor = d_divisor
		dinc d_loop
	  else
		d_divisor = d_divisor + 2
		dift d_divisor > d_root: dinc d_loop
	  endi
    endw
    dg_pass1 = d_factor
ends sub_9quad_prime_test


subr sub_9quad_to_string
'updated 2006/11/25, 2006/11/12, 2006/10/27
'change a 9quad number to a string
    vari d_any, s_any, d_dot, s_dot
    vari d_9part, d_9mult, s_line
    vari s_beg, d_beg

    d_9part = dg_pass1
    d_9mult = dg_pass2
'123456789012345678901234567
'123,456,789,012,345,678,901
'123456789012345678901

    dto$ s_line, d_9part, 0, 0
    $ch$ s_any, "0", 30
    s_line = s_any + s_line
    $off s_line, s_line, 21

    $cut s_beg, s_line, 1, 6
    $tod d_beg, s_beg
    d_beg = d_9mult * 9 + d_beg
    $ch$ s_any, "0", 6
    s_beg = s_any + d_beg
    $off s_beg, s_beg, 6
    $rep s_line, 1, s_beg

    'put in commas
    $ins s_line, 4, ","
    $ins s_line, 8, ","
    $ins s_line, 12, ","
    $ins s_line, 16, ","
    $ins s_line, 20, ","
    $ins s_line, 24, ","

    'take off leading zeros and commas
    d_dot = 1
    dwhi d_dot = 1
	  dinc d_dot
	  $cut s_any, s_line, 1, 1
	  $ift s_any = "0"
		$cut s_line, s_line, 2, 99
		d_dot = 1
	  endi
	  $ift s_any = ","
		$cut s_line, s_line, 2, 99
		d_dot = 1
	  endi
    endw
    sg_pass1 = s_line
ends sub_9quad_to_string


subr sub_9quad_from_string
'updated 2006/11/25, 2006/11/12, 2006/10/28
'9quad string to d_9part
    vari d_any, s_any, d_dot, s_dot
    vari d_9part, d_9mult
    vari s_line, d_good, d_long, s_beg, d_beg

    s_line = sg_pass1
    d_9part = 0
    d_9mult = 0
'123456789012345678901234567
'123,456,789,012,345,678,901
'123456789012345678901

    d_good = 1
    dift d_good = 1
	  'eliminate commas and validate for all numbers
	  $trb s_line, s_line
	  $swp s_line, ",", sg_nothing
	  $ist d_any, s_line, "9"
	  dift d_any <> 1: dinc d_good
    endi
    dift d_good = 1
	  $len d_long, s_line
	  dift d_long < 16
		$tod d_9part, s_line
		dinc d_good
	  endi
    endi
'123456789012345678901234567
'123,456,789,012,345,678,901
'123456789012345678901

    dift d_good = 1
	  'make 21 long
	  $ch$ s_any, "0", 30
	  s_line = s_any + s_line
	  $off s_line, s_line, 21

	  $cut s_beg, s_line, 1, 6
	  $tod d_beg, s_beg

	  d_9mult = d_beg \ 9
	  d_beg = d_beg % 9

	  $cut s_any, s_line, 7, 99
	  s_any = d_beg + s_any
	  $tod d_9part, s_any
    endi

    dg_pass1 = d_9part
    dg_pass2 = d_9mult
ends sub_9quad_from_string


subr sub_teaquad_to_string
'updated 2007/03/30, 2007/02/24, 2006/11/25, 2006/11/12, 2006/10/27
'change a teaquad number in d_teaquadpart,d_teaquadmult to a string
    vari d_any, s_any, d_dot, s_dot
    vari d_teaquadpart, d_teaquadmult, s_line
    vari s_beg, d_beg

    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2

    dift d_teaquadpart < 0
	  dpow d_any, 10 ,15
	  d_teaquadpart = d_teaquadpart + d_any
	  ddec d_teaquadmult	
    endi

'123456789012345678901234567
'123,456,789,012,345,678,901
'123456789012345678901
    dto$ s_line, d_teaquadpart, 0, 0
    $ch$ s_any, "0", 30
    s_line = s_any + s_line
    $off s_line, s_line, 21

    $cut s_beg, s_line, 1, 6
    $tod d_beg, s_beg
    d_beg = d_teaquadmult + d_beg
    $ch$ s_any, "0", 6
    s_beg = s_any + d_beg
    $off s_beg, s_beg, 6
    $rep s_line, 1, s_beg

    'put in commas in 21 digit number
    $ins s_line, 4, ","
    $ins s_line, 8, ","
    $ins s_line, 12, ","
    $ins s_line, 16, ","
    $ins s_line, 20, ","
    $ins s_line, 24, ","

    'take off leading zeros and commas
    d_dot = 1
    dwhi d_dot = 1
	  dinc d_dot
	  $cut s_any, s_line, 1, 1
	  $ift s_any = "0"
		$cut s_line, s_line, 2, 99
		d_dot = 1
	  endi
	  $ift s_any = ","
		$cut s_line, s_line, 2, 99
		d_dot = 1
	  endi
    endw

    sg_pass1 = s_line
ends sub_teaquad_to_string


subr sub_teaquad_from_string
'updated 2007/02/24, 2006/11/25, 2006/11/12, 2006/10/28
'teaquad string to d_teaquadpart,d_teaquadmult
'1part is the 15 digits on the right,1mult is the left digits
    vari d_any, s_any, d_dot, s_dot
    vari d_teaquadpart, d_teaquadmult
    vari s_line, d_good, d_long, s_beg, d_beg

    s_line = sg_pass1
    d_teaquadpart = 0
    d_teaquadmult = 0
'123456789012345678901234567
'123,456,789,012,345,678,901
'123456789012345678901

    d_good = 1
    dift d_good = 1
	  'eliminate commas and validate for all numbers
	  $trb s_line, s_line
	  $swp s_line, ",", sg_nothing
	  $ist d_any, s_line, "9"
	  dift d_any <> 1: dinc d_good
    endi
'123456789012345678901234567
'123,456,789,012,345,678,901
'123456789012345678901

    dift d_good = 1
	  'make 21 long
	  $ch$ s_any, "0", 30
	  s_line = s_any + s_line
	  $off s_line, s_line, 21

	  $cut s_beg, s_line, 1, 6
	  $tod d_teaquadmult, s_beg

	  $cut s_any, s_line, 7, 99
	  $tod d_teaquadpart, s_any
    endi

    dg_pass1 = d_teaquadpart
    dg_pass2 = d_teaquadmult
ends sub_teaquad_from_string


subr sub_teaquad_shift
'updated 2007/02/24
'shift teaquad by correcting d_teaquadpart,d_teaquadmult
    vari d_any, s_any, d_dot, s_dot
    vari d_teaquadpart, d_teaquadmult

    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2

    dpow d_dot, 10, 15
    dift d_teaquadpart > d_dot
	  d_any = d_teaquadpart \ d_dot
	  d_teaquadmult = d_teaquadmult + d_any
	  d_teaquadpart = d_teaquadpart - d_any
    endi

    dg_pass1 = d_teaquadpart
    dg_pass2 = d_teaquadmult
ends sub_teaquad_shift


subr sub_teaquad_from_primes31
'updated 2007/08/30
    vari d_any, s_any, d_dot, s_dot, d_factor, d_debug
    vari d_teaquadpart, d_teaquadmult, d_teaquadone
    vari d_primes31part, d_primes31mult

    'N = 200,560,490,130 * d_primes31mult + d_primes31part
    'max for d_primes31part is 200,560,490,130
    'max for d_primes31mult is 1E7
    d_primes31part = dg_pass1
    d_primes31mult = dg_pass2

    d_debug = 2
    d_teaquadpart = 0
    d_teaquadmult = 0
    d_teaquadone = 10 ^ 15

    '560,490,130
    d_teaquadpart = 560490130 * d_primes31mult + d_primes31part

    dift d_debug = 1
	  ded$ s_any, d_teaquadpart, 0, 0
	  $out "A=" + s_any
    endi

    'any of d_teaquadpart over 1E15 goes into d_teaquadmult
    d_factor = 10 ^ 15
    d_any = d_teaquadpart \ d_factor
    d_teaquadmult = d_any

    dift d_debug = 1
	  ded$ s_any, d_teaquadmult, 0, 0
	  $out "B=" + s_any
    endi

    d_teaquadpart = d_teaquadpart % d_factor

    dift d_debug = 1
	  ded$ s_any, d_teaquadpart, 0, 0
	  $out "C=" + s_any
    endi

    'now get the biggest part without multiplying by 1E9
    d_dot = 200 * d_primes31mult

    dift d_debug = 1
	  ded$ s_any, d_dot, 0, 0
	  $out "D=" + s_any
    endi

    'any of d_dot over 1E6 goes to d_teaquadmult
    d_factor = 10 ^ 6
    d_any = d_dot \ d_factor

    dift d_debug = 1
	  ded$ s_any, d_any, 0, 0
	  $out "E=" + s_any
    endi

    d_teaquadmult = d_teaquadmult + d_any

    dift d_debug = 1
	  ded$ s_any, d_teaquadmult, 0, 0
	  $out "F=" + s_any
    endi

    d_dot = d_dot % d_factor

    'multiply it by 1E9 and add to d_teaquadpart
    d_dot = 10 ^ 9 * d_dot
    d_teaquadpart = d_teaquadpart + d_dot

    dift d_debug = 1
	  ded$ s_any, d_teaquadpart, 0, 0
	  $out "G=" + s_any
    endi

    dg_pass1 = d_teaquadpart
    dg_pass2 = d_teaquadmult
    sub_teaquad_to_string
    $out sg_pass1
ends sub_teaquad_from_primes31


subr sub_file_primes31_to_teaquad
'updated 2007/08/30
'translate file of primes31 to teaquad
'file format from 
'noted prime number researcher Jens Kruse Andersen
    vari d_any, s_any, d_dot, s_dot
    vari s_filein, s_fileout, d_filebyte, s_record
    vari d_process, d_good, d_loop, d_count
    vari d_primes31part, d_primes31mult
  
    d_process = 1
    dift d_process = 1
	  $inp s_filein, "input filename"
	  $ift s_filein = "*": dinc d_process
    endi
    dift d_process = 1
	  $inp s_fileout, "output filename"
	  $ift s_fileout = "*": dinc d_process
    endi

    d_filebyte = 1
    d_loop = d_process
    dwhi d_loop = 1
	  d_good = 1
	  fsip s_record, s_filein, d_filebyte

	  dift d_filebyte = 0
		dinc d_good
		dinc d_loop
	  endi
	  dift d_good = 1
		'must have "10*0+" for a good record
		$lok d_dot, s_record, 1, "10*0+"
		dift d_dot = 0: dinc d_good
	  endi
	  dift d_good = 1
		d_primes31part = 0
		d_primes31mult = 0

		d_dot = d_dot + 5
		$cut s_record, s_record, d_dot, 999
		$trb s_record, s_record
		$lok d_dot, s_record, 1, " "

		$cut s_dot, s_record, 1, d_dot
		$trb s_dot, s_dot
		$isd d_any, s_dot
		dift d_any = 1: $tod d_primes31mult, s_dot
		
		$cut s_dot, s_record, d_dot, 999
		$trb s_dot, s_dot
		$isd d_any, s_dot
		dift d_any = 1: $tod d_primes31part, s_dot
	  endi
	  dift d_good = 1
		dg_pass1 = d_primes31part
		dg_pass2 = d_primes31mult
		sub_teaquad_from_primes31
		s_record = sg_pass1

		fapp d_any, s_fileout, s_record
		dbad d_any = 0

		dinc d_count
	  endi
    endw

    $inp s_any, "count=" + d_count
ends sub_file_primes31_to_teaquad


subr sub_test_primes31_to_teaquad
'updated 2007/08/30
    vari d_any, s_any, d_dot, s_dot
    vari s_input, d_loop, d_good
    vari d_primes31part, d_primes31mult

    d_loop = 1
    dwhi d_loop = 1
	  d_good = 1
	  dift d_good = 1
	      $inp s_input, "enter primes31mult=x"
		$ift s_input = "*": dinc d_good
		$isd d_any, s_input
		dift d_any = 1: $tod d_primes31mult, s_input
	  endi  
	  dift d_good = 1
	      $inp s_input, "enter primes31part=y"
		$ift s_input = "*": dinc d_good
		$isd d_any, s_input
		dift d_any = 1: $tod d_primes31part, s_input
	  endi  
	  dift d_good = 1
		dg_pass1 = d_primes31part
		dg_pass2 = d_primes31mult
		sub_teaquad_from_primes31
	  endi

	  d_loop = d_good
    endw
ends sub_test_primes31_to_teaquad


subr sub_teaquad_mod_test
'updated 2008/11/04, 2007/04/01
'2007/03/27, 2007/03/03, 2007/03/02, 2007/02/27, 2007/02/26
'test teaquad and 9quad mod
    vari d_any, s_any, d_dot, s_dot
    vari d_tqdpart, d_tqdmult
    vari s_2to53, d_2to53, d_tqdone
    vari d_process, d_number, d_root
    vari d_mod1, d_mod2, d_mod3, d_mod4, d_mod5, d_mod6
    vari s_dashes, s_err

    $ch$ s_dashes, "-", 70
    s_err = "number too big"
    dpow d_2to53, 2, 53
    ded$ s_2to53, d_2to53, 0, 0
    s_err = "number bigger than=" + s_2to53
    dpow d_tqdone, 10, 15

    d_process = 1
    dift d_process = 1
	  $out "we use tqd to mean teaquad below"
	  $inp s_any, "enter d_tqdpart"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  d_tqdpart = 1
	  dift d_any = 1: $tod d_tqdpart, s_any
    endi    
    dift d_process = 1
	  $inp s_any, "enter d_tqdmult"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  d_tqdmult = 1
	  dift d_any = 1: $tod d_tqdmult, s_any
    endi    
    dift d_process = 1
	  d_number = d_tqdone * d_tqdmult + d_tqdpart
	  dpow d_root, d_number, 0.5
	  dtru d_root, d_root

	  $out s_dashes
	  ded$ s_any, d_2to53, 0, 0
	  $out "d_2to53=" + s_any

	  $out s_dashes
	  ded$ s_any, d_tqdone, 0, 0
	  $out "d_tqdone=" + s_any

	  $out s_dashes
	  $out "we are using tqd to mean teaquad below:"
	  $out "the tqd algorithm in C90 briefly is as follows:"

	  s_any = "d_mod = fmod(d_tqdpart + d_tqdmult * "
	  $app s_any, "fmod(d_tqdone, d_div), d_div);"
	  $out s_any

	  $out s_dashes
	  ded$ s_any, d_tqdpart, 0, 0
	  $out "d_tqdpart=" + s_any

	  $out s_dashes
	  ded$ s_any, d_tqdmult, 0, 0
	  $out "d_tqdmult=" + s_any

	  $out s_dashes
	  ded$ s_any, d_number, 0, 0
	  $out "d_number=" + s_any

	  $out s_dashes
	  ded$ s_any, d_root, 0, 0
	  d_dot = d_root * d_root
	  ded$ s_dot, d_dot, 0, 0
	  $out "d_root=" + s_any + " squared=" + s_dot
    endi
    dift d_process = 1
	  d_mod1 = d_tqdpart
	  d_mod2 = d_tqdone % d_root
	  d_mod3 = d_mod2 * d_tqdmult
	  d_mod4 = d_mod1 + d_mod3
	  d_mod5 = d_mod4 % d_root
	  d_mod6 = d_tqdmult * d_root + d_tqdone

	  $out s_dashes
	  d_mod1 = d_tqdpart
	  ded$ s_any, d_tqdpart, 0, 0
	  $out "d_tqdpart=" + s_any
	  dift d_mod1 > d_2to53: $out s_err

	  $out s_dashes
	  d_mod2 = d_tqdone % d_root
	  ded$ s_any, d_mod2, 0, 0
	  $out "d_tqdone % d_root=" + s_any
	  dift d_mod2 > d_2to53: $out s_err

	  $out s_dashes
	  d_mod3 = d_mod2 * d_tqdmult
	  ded$ s_any, d_mod3, 0, 0
	  $out "d_tqdmult * (d_tqdone % d_root)=" + s_any
	  dift d_mod3 > d_2to53: $out s_err

	  $out s_dashes
	  d_mod4 = d_mod1 + d_mod3
	  ded$ s_any, d_mod4, 0, 0
	  $out "d_tqdpart + d_tqdmult * (d_tqdone % d_root)=" + s_any
	  dift d_mod4 > d_2to53: $out s_err

	  $out s_dashes
	  d_mod5 = d_mod4 % d_root
	  ded$ s_any, d_mod5, 0, 0
	  s_dot = "(d_tqdpart + d_tqdmult * "
	  $app s_dot, "(d_tqdone % d_root)) % d_root=" + s_any
	  $out s_dot
	  dift d_mod5 > d_2to53: $out s_err

	  $out s_dashes
	  d_mod6 = d_tqdmult * d_root + d_tqdone
	  $out "d_max = d_root * d_tqdmult + d_tqdone"
	  ded$ s_any, d_mod6, 0, 0
	  $out "d_max=" + s_any
	  dift d_mod6 > d_2to53: $out s_err
    endi

    $inp s_any, "done"
ends sub_teaquad_mod_test


subr sub_teaquad_5tp39_analyze_an_a_file
'updated 2008/04/07
    vari d_any, s_any, d_dot, s_dot
    vari d_filebyte, s_record, s_prevrecord, s_inputfile
    vari d_process, d_loop, d_good
    vari s_hour, d_hour, d_prevhour

    d_process = 1
    dift d_process = 1
        $inp s_inputfile, "enter input file ie. a5tp39x3.txt"
	  $ift s_inputfile = "*": dinc d_process
    endi
    d_filebyte = 1
    d_loop = d_process
    dwhi d_loop = 1
	  d_good = 1
	  fsip s_record, s_inputfile, d_filebyte
	  dift d_filebyte = 0
		dinc d_loop
		dinc d_good
	  endi
	  dift d_good = 1
		$cut s_any, s_record, 1, 1
		$ist d_any, s_any, "9"
		dift d_any <> 1: dinc d_good

		$lok d_dot, s_record, 1, ":"
		dift d_dot < 3: dinc d_good
	  endi
	  dift d_good = 1
		d_dot = d_dot - 2
		$cut s_hour, s_record, d_dot, 2
		$ist d_any, s_hour, "9"
		dift d_any <> 1: dinc d_good
	  endi
	  dift d_good = 1
		$tod d_hour, s_hour
		d_any = d_prevhour + 1
		dift d_any = 24: d_any = 0
		dift d_any <> d_hour
		    $out s_prevrecord
		    $out s_record
		    $inp s_any, "not right"
		    $ift s_any = "*": dinc d_loop
		endi
		d_prevhour = d_hour
		s_prevrecord = s_record
	  endi
    endw

ends sub_teaquad_5tp39_analyze_an_a_file


subr sub_test_for_pnq30
'updated 2002/12/08
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_loop, d_quadprime, d_factor
    vari d_good, d_number, s_number, d_count

    d_loop = 1
    dwhi d_loop = 1
	  s_out = "enter the first number or the PIVCOM of a PNQ30"
	  $inp s_number, s_out
	  $isd d_any, s_number

	  dift d_any <> 1
		dinc d_loop
	  else
	      $tod d_number, s_number
		dfac d_any, d_number
		dift d_any = 2: d_number = d_number - 19

		dg_pass1 = d_number
		sub_pnq30_testshow
	  endi
    endw
ends sub_test_for_pnq30


subr sub_pnq30_testshow
'updated 2002/12/08
    vari d_any, s_any, d_dot, s_dot
    vari d_quadprime, d_factor, d_pivcom, d_hastwinpivcom
    vari d_good, d_number, s_number, d_count

    d_quadprime = dg_pass1
    d_hastwinpivcom = 2
    d_count = 0
    d_good = 1

    dift d_good = 1
        d_number = d_quadprime
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 2
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 6
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 8
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 30
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 32
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 36
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        d_number = d_quadprime + 38
        dfac d_factor, d_number
        dift d_factor = 1
	      dinc d_count
		ded$ s_number, d_number, 20, 0
		$out d_count + ". prime=" + s_number
        else
	      dinc d_good
        endi
    endi	  
    dift d_good = 1
        'test for the twin pivcom
	  'pivcom was coined by Roger Hargrave in 2002
        d_pivcom = d_quadprime + 19
	  d_number = d_pivcom - 1
	  dfac d_factor, d_number
        dift d_factor = 1
		d_number = d_pivcom + 1
		dfac d_factor, d_number
		dift d_factor = 1
		    ded$ s_any, d_pivcom, 0, 0
		    d_hastwinpivcom = 1
		    $out "pivcom is twin prime pivcom = " + s_any
		endi
        endi
    endi

    dg_pass1 = d_good
    dg_pass2 = d_hastwinpivcom
ends sub_pnq30_testshow


subr sub_pnq30_test_quiet
'updated 2002/11/30
    vari d_any, s_any, d_dot, s_dot
    vari d_pnq30, d_factor
    vari d_good, d_number

    d_pnq30 = dg_pass1
    d_good = 1

    dift d_good = 1
        d_number = d_pnq30
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 2
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 6
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 8
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 30
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 32
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 36
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_pnq30 + 38
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		dto$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dg_pass1 = d_good
ends sub_pnq30_test_quiet


subr sub_pnq30_file_test
'updated 2003/05/24
    vari d_any, s_any, d_dot, s_dot, s_out
    vari s_filename, s_filedata, d_loop, d_big, d_error
    vari s_number, d_number, d_count, d_byte, d_long, d_process
    vari s_previous, d_previous, d_time1, d_time2
    vari s_diff, d_diff, d_mindiff, d_atmindiff
    vari d_onlypnq30, d_yestestfromgaps, d_quietpnq30
    vari d_pivcom, d_ctadd1pivcom, d_ctsub1pivcom
    vari s_line, d_twinct, d_testtwin
    vari d_yestestsmallgaps, d_yestestlargegaps, d_testctpivcom
    vari d_index, d_gcd, d_good, d_begnumber

    d_process = 1
    dift d_process = 1
        $inp s_filename, "enter name of the file or FIXPRIME.EXP"
	  $ift s_filename = "*": dinc d_process
    endi
    dift d_process = 1
        $trb s_filename, s_filename
        $len d_any, s_filename
        dift d_any = 0: s_filename = "FIXPRIME.EXP"
        finp s_filedata, s_filename
	  $bes s_filedata, s_filedata
    endi
    dift d_process = 1
        d_testtwin = 2
        $inp s_any, "1 = check for twin pivcoms"
	  $ift s_any = "*": dinc d_process
        $ift s_any = "1": d_testtwin = 1
    endi
    dift d_process = 1
        d_yestestsmallgaps = 2
        $inp s_any, "1 = test for small gaps"
        $ift s_any = "1": d_yestestsmallgaps = 1
	  $ift s_any = "*": dinc d_process
    endi
    dift d_process = 1
        d_yestestlargegaps = 2
        $inp s_any, "1 = test for large gaps"
        $ift s_any = "1": d_yestestlargegaps = 1
	  $ift s_any = "*": dinc d_process
    endi
    dift d_process = 1
	  d_onlypnq30 = 2
	  $inp s_any, "1 = test only PNQ30s"
	  $ift s_any = "1": d_onlypnq30 = 1
	  $ift s_any = "*": dinc d_process
    endi
    dift d_process = 1
	  d_quietpnq30 = 2
	  $inp s_any, "1 = quiet pnq30"
	  $ift s_any = "1": d_quietpnq30 = 1
	  $ift s_any = "*": dinc d_process
    endi
    dift d_process = 1
	  d_yestestfromgaps = 2
	  $inp s_any, "1 = test from gaps"
	  $ift s_any = "1": d_yestestfromgaps = 1
	  $ift s_any = "*": dinc d_process 
    endi
    dift d_process = 1
	  d_testctpivcom = 2
	  $inp s_any, "1 = test ctpivcom"
	  $ift s_any = "1": d_testctpivcom = 1
	  $ift s_any = "*": dinc d_process
    endi
    dift d_process = 1
	  d_begnumber = 0
	  $inp s_any, "minimum number to begin with, default 0"
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_begnumber, s_any
	  $ift s_any = "*": dinc d_process
    endi
    dift d_process = 1
        $len d_long, s_filedata
        $out "length=" + d_long
	  dift d_long < 1: dinc d_process
    endi
    dift d_process = 1	  
	  dsec d_time1

	  dift d_onlypnq30 <> 1
	      'test PNQ30: to see if correct
	      sg_pass1 = s_filedata
	      sub_pnq30_string_test
	  endi
	  
	  d_ctadd1pivcom = 0
	  d_ctsub1pivcom = 0
        d_index = 1
        dpow d_mindiff, 10, 15
        d_previous = 0
        d_atmindiff = 0
        d_twinct = 0

    endi
    dift d_process = 1

	  d_count = 0
	  dpow d_big, 10, 9
	  $cup s_filedata, s_filedata

	  d_loop = 1
	  dwhi d_loop = 1

		d_good = 1
		$lok d_byte, s_filedata, 1, "PNQ30="

		dift d_byte = 0
		    dinc d_loop
		    dinc d_good
		endi
		dift d_good = 1
		    'get the line to output below
		    $cut s_line, s_filedata, d_byte, 70
		    
		    d_byte = d_byte + 6

		    'eliminate the 'PNQ30='
		    $cut s_filedata, s_filedata, d_byte, d_big
		    $trb s_filedata, s_filedata

		    'find the blank at the end of the number
		    $lok d_byte, s_filedata, 1, " "

		    'get the number into a string
		    $cut s_number, s_filedata, 1, d_byte

		    'prep the string for next look
		    $cut s_filedata, s_filedata, d_byte, d_big

		    'do we have a number
		    $trb s_number, s_number
		    $isd d_good, s_number
		endi
		dift d_good = 1
		    'we have a number
		    $tod d_number, s_number
		    'it cannot be smaller than d_begnumber
		    dift d_number < d_begnumber: dinc d_good
		endi
		dift d_good = 1
		    ded$ s_number, d_number, 0, 0
		    $out s_number

		    dift d_quietpnq30 = 1
			  dg_pass1 = d_number
			  sub_pnq30_test_quiet
			  d_good = dg_pass1
			  dift d_good <> 1
				$out "not PNQ30=" + s_number
				$inp s_any, "return"
			  endi
		    else
		        dg_pass1 = d_number
		        sub_pnq30_testshow
		        d_good = dg_pass1
			  dift d_good <> 1
				$out "not PNQ30=" + s_number
				$inp s_any, "return"
			  endi
		    endi
		endi
		dift d_good = 1
		    dinc d_count
		    $out d_count + ":PNQ30=" + s_number

		    dift d_testctpivcom = 1
			  'test to see if TWIN PIVCOM
		        dg_pass1 = d_number
		        sub_test_ctpivcom
		    endi

		    dift d_yestestfromgaps = 1
		        'what about the gap to the previous prime
		        dg_pass1 = d_number 
		        dg_pass2 = -2
		        sub_find_next_prime

		        'what about the gap to the next prime
		        dg_pass1 = d_number + 38
		        dg_pass2 = 2
		        sub_find_next_prime
		    endi

		    'pivcom was coined by Roger Hargrave in 2002
		    'pivcom = pivotal composite = d_number + 19
		    d_pivcom = d_number + 19

		    'is the pivcom the pivcom of a twin prime set
		    d_dot = d_pivcom - 1
		    dfac d_any, d_dot

		    'how many pivcom sub 1 are prime
		    dift d_any = 1: dinc d_ctsub1pivcom

		    d_dot = d_pivcom + 1
		    dfac d_dot, d_dot

		    'how many pivcom add 1 are prime
		    dift d_dot = 1: dinc d_ctadd1pivcom

		    d_dot = d_any + d_dot
		    dift d_dot = 2
			  'we have a twin pivcom
			  dinc d_twinct
			  $out s_line
			  s_out = d_twinct + ". TWIN PIVCOM at PNQ30="
			  $app s_out, s_number

			  dift d_testtwin = 1
			      $lok d_any, s_line, 1, "PIVCOM"
			      dift d_any = 0: $inp s_any, s_out
			  else
				$out s_out
			  endi
		    else
			  'we do not have a twin pivcom
			  $lok d_any, s_line, 1, "PIVCOM"
			  dift d_any > 0
				$out s_number
				$inp s_any, "not TWIN PIVCOM but marked as one"
			  endi
		    endi

		    'find difference from the previous PNQ30
		    d_diff = d_number - d_previous
		    ded$ s_diff, d_diff, 0, 0

		    dift d_diff < d_mindiff
			  d_mindiff = d_diff
			  d_atmindiff = d_previous
		    endi

		    dift d_diff < 1000
			  ded$ s_any, d_previous, 0, 0
			  $out s_any
			  ded$ s_any, d_number, 0, 0
			  $out s_any
			  $out s_diff
			  $inp s_any, "difference too small"
		    endi

		    d_any = d_diff / 210
		    d_dot = d_diff \ 210
		    dift d_any <> d_dot
			  ded$ s_any, d_any, 0, 0
			  $out "d_diff / 210=" + s_any

			  ded$ s_dot, d_dot, 0, 0
			  $out "d_diff \ 210=" + s_dot

			  $inp s_any, "bad divide by 210"
		    endi

		    'output differences
		    s_out = "diff=" + s_diff 
		    ded$ s_any, d_mindiff, 0, 0
		    $app s_out, ", mindiff=" + s_any
		    ded$ s_any, d_atmindiff, 0, 0
		    $app s_out, ", min at=" + s_any
		    $out s_out

		    dift d_yestestlargegaps = 1
			  'test for a large gap
			  dpow d_any, 10, 10
			  dift d_diff >= d_any
			     s_out = "large gap=" + s_diff + " at "
			     $app s_out, s_previous + " & " + s_number
			     $inp s_any, s_out
			  endi
		    endi
		    dift d_yestestsmallgaps = 1
			  'test for a small gap
			  dpow d_any, 10, 6
			  dift d_diff <= d_any
			     s_out = "small gap=" + s_diff + " at "
			     $app s_out, s_previous + " & " + s_number
			     $inp s_any, s_out
			  endi
		    endi

		    d_previous = d_number
		    s_previous = s_number
		endi
	  endw
    endi

    ded$ s_any, d_ctsub1pivcom, 0, 0
    $out "prime count of pivcom - 1 = " + s_any

    ded$ s_any, d_ctadd1pivcom, 0, 0
    $out "prime count of pivcom + 1 = " + s_any

    ded$ s_any, d_count, 0, 0
    $out "PNQ30 count=" + s_any

    dsec d_time2
    d_any = d_time2 - d_time1
    ded$ s_any, d_any, 0, 0
    $out "seconds=" + s_any

    $inp s_any, "done"
ends sub_pnq30_file_test


subr sub_test_ctpivcom
'updated 2003/01/26
'test ctpivcom for mod of 11, 13, 17, 19
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_pnq30, s_pnq30, d_ctpivcom, s_ctpivcom

    d_pnq30 = dg_pass1
    ded$ s_pnq30, d_pnq30, 0, 0
 
    d_ctpivcom = d_pnq30 + 19 \ 210
    ded$ s_ctpivcom, d_ctpivcom, 0, 0

    dfac d_any, d_ctpivcom
    ded$ s_any, d_any, 0, 0

    s_out = "pnq30=" + s_pnq30
    $app s_out, " ctpivcom=" + s_ctpivcom
    $app s_out, " divisor=" + s_any
    $out s_out

    d_any = d_ctpivcom % 11
    s_out = "%11=" + d_any
    d_any = d_ctpivcom % 13
    $app s_out, ", %13=" + d_any
    d_any = d_ctpivcom % 17
    $app s_out, ", %17=" + d_any
    d_any = d_ctpivcom % 19
    $app s_out, ", %19=" + d_any
    $inp s_any, s_out   
ends sub_test_ctpivcom


subr sub_pnq30_string_test
'updated 2002/01/26
'test PNQ30: to see if correct
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_loop, d_number, s_number, s_string
    vari d_byte, d_count, d_previous
    vari d_diff, s_diff, d_maxdiff, s_max
    
    s_string = sg_pass1
    sg_pass1 = sg_nothing
    $cup s_string, s_string

    'look for PNQ30:
    d_count = 0
    d_byte = 1
    d_loop = 1

    dwhi d_loop = 1
	  $lok d_byte, s_string, d_byte, "PNQ30: "

	  dift d_byte = 0
		$out "PNQ30: count=" + d_count
		dinc d_loop
	  else
		d_dot = d_byte + 7
		$cut s_dot, s_string, d_dot, 30
		$trb s_dot, s_dot

		$lok d_any, s_dot, 1, " "
		$cut s_number, s_dot, 1, d_any
		$trb s_number, s_number

		$isd d_any, s_number
		dift d_any = 1
		    dinc d_count
		    $tod d_number, s_number

		    'test to see if pnq30
		    dg_pass1 = d_number
		    sub_pnq30_testshow
		    d_any = dg_pass1

		    dift d_any = 1
			  $out "PNQ30: " + s_number
		    else
			  s_out = "not PNQ30=" + s_number
			  $inp s_any, s_out
		    endi
		else
		    $out "bad number=" + s_number
		endi
	  endi

	  dinc d_byte
    endw
    $inp s_any, "PNQ30: tested, count=" + d_count
ends sub_pnq30_string_test


subr sub_find_next_prime
'updated 2003/02/02
'find the next prime number after dg_pass1 
'in direction of dg_pass2
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_loop, d_begnumber, d_testnumber
    vari d_divisor, d_prime, d_gap, d_delta

    'get the beginning number and the delta
    d_begnumber = dg_pass1
    d_delta = dg_pass2
    'd_delta can be +2 or -2

    d_testnumber = d_begnumber + d_delta
    d_prime = 1
    d_loop = 1

    dwhi d_loop = 1
	  dfac d_divisor, d_testnumber

	  dift d_divisor = 1
		d_prime = d_testnumber
		dinc d_loop
	  else
		d_testnumber = d_testnumber + d_delta
	  endi
    endw

    ded$ s_any, d_begnumber, 0, 0
    ded$ s_dot, d_prime, 0, 0
    s_out = "begin=" + s_any + ", next prime=" + s_dot

    d_gap = d_prime - d_begnumber
    ded$ s_any, d_gap, 0, 0
    $app s_out, ", gap=" + s_any

    $out s_out

    'stop if absolute value of gap is large
    dabs d_any, d_gap
    dift d_any >= 200: $inp s_any, "gap to next prime"

    dg_pass1 = d_gap
ends sub_find_next_prime


subr sub_5TP39_clusters
'updated 2004/02/22
    vari d_any, s_any, d_dot, s_dot, s_out
    vari s_filename, s_filedata, s_line, d_loop, d_big, d_good
    vari d_diff, d_minimum, d_maximum
    vari d_clusterct, d_index, d_number1, d_number2, d_show
    vari s_number, d_count, d_byte, d_long, d_process

    d_process = 1
    dift d_process = 1
	  d_clusterct = 5
	  $inp s_any, "enter number per cluster"
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_clusterct, s_any

	  dpow d_maximum, 10, 13
	  $inp s_any, "enter number for maximum spread"
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_maximum, s_any
    endi
    dift d_process = 1
        $inp s_filename, "enter name of the file or fix5tp39.exp"
	  $ift s_filename = "*": dinc d_process
    endi
    dift d_process = 1
	  'get the file into s_filedata
        $trb s_filename, s_filename
        $len d_any, s_filename
        dift d_any = 0: s_filename = "fix5tp39.exp"
        finp s_filedata, s_filename
	  $bes s_filedata, s_filedata
    endi
    dift d_process = 1
        $len d_long, s_filedata
        $out "length=" + d_long
	  dift d_long < 1: dinc d_process
    endi
    dift d_process = 1
	  arrz
	  d_index = 1

	  d_count = 0
	  dpow d_big, 10, 9
	  $cup s_filedata, s_filedata

	  d_loop = 1
	  dwhi d_loop = 1

		d_good = 1
		$lok d_byte, s_filedata, 1, "5TP39="

		dift d_byte = 0
		    dinc d_loop
		    dinc d_good
		endi
		dift d_good = 1
		    'get the line to output below
		    $cut s_line, s_filedata, d_byte, 50
		    
   	          d_byte = d_byte + 6
  
		    'eliminate the '5TP39='
		    $cut s_filedata, s_filedata, d_byte, d_big
		    $trb s_filedata, s_filedata

		    'find the blank at the end of the number
		    $lok d_byte, s_filedata, 1, " "

		    'get the number into a string
		    $cut s_number, s_filedata, 1, d_byte

		    'prep the string for next look
		    $cut s_filedata, s_filedata, d_byte, d_big

		    'do we have a number
		    $trb s_number, s_number
		    $isd d_good, s_number
		endi
		dift d_good = 1
		    'we have a 5TP39
		    $tod d_number1, s_number
		    dtoi d_index, d_number1
		endi

		dinc d_index
		dift d_index > 2000: dinc d_loop
	  endw

	  dpow d_minimum, 10, 15
	  d_index = 1
	  d_loop = 1
	  dwhi d_loop = 1
		itod d_number1, d_index
		d_dot = d_index + d_clusterct
		itod d_number2, d_dot
		d_diff = d_number2 - d_number1
		dabs d_diff, d_diff
		d_show = 2
		dift d_diff < d_maximum: d_show = 1

		d_any = d_number1 * d_number2
		dift d_any = 0
		    dinc d_show
		    dinc d_loop
		endi

		dift d_show = 1
		    ded$ s_any, d_maximum, 0, 0
		    s_out = "cluster count=" + d_clusterct
		    $app s_out, ", maximum diff=" + s_any
		    $out s_out

		    ded$ s_any, d_number1, 0, 0
		    s_out = d_index + ". " + s_any
		    $out s_out

		    ded$ s_any, d_number2, 0, 0
		    s_out = d_dot + ". " + s_any
		    $out s_out

		    ded$ s_any, d_diff, 0, 0
		    s_out = "diff=" + s_any
		    $out s_out

		    $inp s_any, "more"
		endi

		dinc d_index
		dift d_index > 2000: dinc d_loop
	  endw
    endi
    $inp s_any, "done"
ends sub_5TP39_clusters

subr sub_teaquad_5tp39_teapro_loop
'updated 2007/12/08, 2007/12/07, 2007/12/06, 2007/12/05
    vari d_any, s_any, d_dot, s_dot
    vari d_teaquadpart, d_teaquadmult, d_teaquadone
    vari s_number, d_factor
    vari d_loop, d_good, d_sec1, d_sec2, d_sec3

    d_teaquadmult = 0
    d_teaquadpart = 101

    d_loop = 1
    dwhi d_loop = 1
	  d_good = 1
	  dift d_good = 1
		$out "1= 10,352,983,611,791"
		$out "2= 100,749,831,367,481"
		$out "3= 1,000,946,235,399,161"
		$out "4= 10,011,767,333,774,411"
		$out "5= 100,008,118,644,774,251"
		$out "6= 1,000,012,759,669,197,941"
	      $inp s_any, "enter number"
	      $ift s_any = "*": dinc d_good
		$ift s_any = "1": s_any = "10,352,983,611,791"
		$ift s_any = "2": s_any = "100,749,831,367,481"
		$ift s_any = "3": s_any = "1,000,946,235,399,161"		
		$ift s_any = "4": s_any = "10,011,767,333,774,411"
		$ift s_any = "5": s_any = "100,008,118,644,774,251"
		$ift s_any = "6": s_any = "1,000,012,759,669,197,941"
	  endi
	  dift d_good = 1
		s_number = s_any
		$out "number=" + s_number
	  endi
	  dift d_good = 1
	      sg_pass1 = s_number
	      sub_teaquad_from_string
	      d_teaquadpart = dg_pass1
	      d_teaquadmult = dg_pass2
		s_any = "teaquadmult=" + d_teaquadmult
		$app s_any, " teaquadpart=" + d_teaquadpart
		$out s_any
	  endi
	  dift d_good = 1
		'use DFAK
		dg_pass1 = d_teaquadpart
		dg_pass2 = d_teaquadmult
		dsec d_sec1
		dfak d_factor, d_teaquadpart, d_teaquadmult
		dsec d_sec2

		d_sec3 = d_sec2 - d_sec1
		$out "DFAK factor=" + d_factor + " sec=" + d_sec3

		dg_pass1 = d_teaquadpart
		dg_pass2 = d_teaquadmult
		dsec d_sec1
		sub_5tp39_test_teapro_loop01
		dsec d_sec2

		d_factor = dg_pass1
		d_sec2 = d_sec2 - d_sec1
		$out "loop factor=" + d_factor + " sec=" + d_sec2

		d_any = d_sec2 / d_sec3
		$out "ratio=" + d_any

		$inp s_any, "more"
		$ift s_any = "*": dinc d_good
	  endi

	  d_loop = d_good
    endw
ends sub_teaquad_5tp39_teapro_loop


subr sub_5TP39_test_teapro_loop01
'updated 2007/12/08, 2007/12/05, 2004/01/23
    vari d_any, s_any, d_dot, s_dot
    vari d_teaquadpart, d_teaquadmult, d_teaquadone
    vari d_divisor, d_root, d_modulus, d_mod1, d_mod2, d_result
    vari d_loop, d_count

    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2

    d_teaquadone = 10 ^ 15

    d_any = d_teaquadone * d_teaquadmult + d_teaquadpart
    dpow d_root, d_any, 0.5

'd_modulus = fmod(fmod(d_teaquadpart, d_divisor)
'+ d_teaquadmult * fmod(d_teaquadone, d_divisor), d_divisor);

    d_result = 1
    d_divisor = 3
    d_loop = 1

    gtag tag_top
	  dinc d_count

	  d_mod1 = d_teaquadpart % d_divisor
	  d_mod2 = d_teaquadone % d_divisor
	  d_modulus = d_teaquadmult * d_mod2 + d_mod1 % d_divisor 

'$out "d_divisor=" + d_divisor + " d_mod1=" + d_mod1 + " d_mod2=" + d_mod2
'$out "d_modulus=" + d_modulus

	  dift d_modulus = 0
		dinc d_loop
		d_result = d_divisor
	  endi

	  d_divisor = d_divisor + 2
    dift d_divisor <= d_root: goto tag_top

    ded$ s_any, d_count, 0, 0
    $out "count=" + s_any
    dg_pass1 = d_result
ends sub_5TP39_test_teapro_loop01


subr sub_5TP39_test_teapro_loop99
'updated 2007/12/05, 2004/01/23
    vari d_any, s_any, d_dot, s_dot
    vari d_teaquadpart, d_teaquadmult, d_teaquadone
    vari d_divisor, d_root, d_modulus, d_mod1, d_mod2, d_result
    vari d_loop, d_count

    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2

    d_teaquadone = 10 ^ 15

    d_any = d_teaquadone * d_teaquadmult + d_teaquadpart
    dpow d_root, d_any, 0.5

'd_modulus = fmod(fmod(d_teaquadpart, d_divisor)
'+ d_teaquadmult * fmod(d_teaquadone, d_divisor), d_divisor);

    d_result = 1
    d_divisor = 3
    d_loop = 1

    gtag tag_top
	  dinc d_count

	  d_mod1 = d_teaquadpart % d_divisor
	  d_mod2 = d_teaquadone % d_divisor
	  d_modulus = d_teaquadmult * d_mod2 + d_mod1 % d_divisor 

'$out "d_divisor=" + d_divisor + " d_mod1=" + d_mod1 + " d_mod2=" + d_mod2
'$out "d_modulus=" + d_modulus

	  dift d_modulus = 0
		dinc d_loop
		d_result = d_divisor
	  endi

	  d_divisor = d_divisor + 2
	  dift d_divisor > d_root: goto tag_end
    goto tag_top
    gtag tag_end

    ded$ s_any, d_count, 0, 0
    $out "count=" + s_any
    dg_pass1 = d_result
ends sub_5TP39_test_teapro_loop99


subr sub_5TP39_test_quiet
'updated 2004/03/21
    vari d_any, s_any, d_dot, s_dot
    vari d_5TP39, d_factor
    vari d_good, d_number

    d_5TP39 = dg_pass1
    d_good = 1

    dift d_good = 1
        d_number = d_5TP39
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 2
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 6
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 8
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 18
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 20
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 30
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 32
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 36
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 38
        dfac d_factor, d_number
        dift d_factor <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any + ", factor=" + d_factor
	  endi
    endi	  
    dg_pass1 = d_good
ends sub_5TP39_test_quiet


subr sub_5TP39_test_simple
'updated 2003/04/10
'use sub_prime_test_using_prime_array rather than dfac
    vari d_any, s_any, d_dot, s_dot
    vari d_5TP39, d_sec1, d_sec2
    vari d_good, d_number

    d_5TP39 = dg_pass1
    dsec d_sec1
    d_good = 1

    dift d_good = 1
        d_number = d_5TP39

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 2

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 6

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 8

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 18

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 20

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 30

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 32

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 36

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dift d_good = 1
        d_number = d_5TP39 + 38

	  dg_pass1 = d_number
        sub_prime_test_using_prime_array
        dift dg_pass1 <> 1
		dinc d_good
		ded$ s_any, d_number, 0, 0
		$out "not prime=" + s_any
	  endi
    endi	  
    dsec d_sec2
    d_any = d_sec2 - d_sec1
    $out "seconds=" + d_any
    dg_pass1 = d_good
ends sub_5TP39_test_simple


subr sub_teaquad_primes_1101
'updated 2008/11/09, 2008/10/19, 2008/10/10, 2007/03/28
'2007/03/19, 2007/03/05, 2007/03/02, 2007/02/27, 2007/02/25
'2006/11/30, 2006/11/26, 2006/11/25, 2006/04/08, 2002/05/02
'find primes of the form of 101
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_loop, d_number, s_number, d_mode
    vari d_firstdigits, d_countofzeros, d_lastdigit, d_primect
    vari d_factor, s_factor, d_totseconds
    vari d_process, d_seconds, d_yfile, s_filename
    vari d_teaquadpart, d_teaquadmult

    d_process = 1
    dift d_process = 1
	  d_mode = 2
	  $inp s_any, "2=2 digit, 3=3 digit above 1E15"
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "3": d_mode = 3
    endi
    dift d_process = 1
	  s_filename = "prim1101.txt"
	  d_yfile = 2
	  $inp s_any, "1=save to file=" + s_filename
	  $ift s_any = "*": dinc d_process
	  $ift s_any = "1": d_yfile = 1
    endi
    dift d_process = 1
	  dift d_yfile = 1
	      flen d_any, s_filename
	      dift d_any >= 0
		    $inp s_any, "1=purge " + s_filename
		    $ift s_any = "*": dinc d_process
		    $ift s_any = "1": fdel d_any, s_filename
	      endi
	  endi
    endi
    dift d_mode = 2
        d_firstdigits = 10
        d_countofzeros = 1
    else
	  d_firstdigits = 1
	  d_countofzeros = 14
    endi	
    d_lastdigit = 1

    dsec d_totseconds

    d_primect = 0
    d_loop = d_process
    dwhi d_loop = 1
	  'construct the number
	  $ch$ s_any, "0", d_countofzeros
	  s_number = d_firstdigits + s_any + "1"

	  'change from s_number to d_teaquadpart, d_teaquadmult
	  sg_pass1 = s_number
	  sub_teaquad_from_string
	  d_teaquadpart = dg_pass1
	  d_teaquadmult = dg_pass2

	  dsec d_seconds

        'test for prime single
        dfak d_factor, d_teaquadpart, d_teaquadmult

	  dsec d_any
	  d_seconds = d_any - d_seconds

	  dift d_factor = 1: dinc d_primect

	  'change to edited string
	  dg_pass1 = d_teaquadpart
	  dg_pass2 = d_teaquadmult
	  sub_teaquad_to_string
	  s_number = sg_pass1

	  ded$ s_factor, d_factor, 0, 0
        s_out = d_primect + "." + " " + s_number
	  $app s_out, ", factor=" + s_factor
	  $app s_out, ", sec=" + d_seconds

	  dift d_factor = 1
	      $out s_out
	      dift d_yfile = 1: fapp d_any, s_filename, s_out
	  else
	      $sho s_out
	  endi

	  'increment
	  'max is 1,000,000,000,000,000,000,001
	  dift d_mode = 2
		dinc d_firstdigits
		dift d_firstdigits > 99
	          d_firstdigits = 10
	          dinc d_countofzeros
		endi
            dift d_countofzeros >= 19
		    'max is 1,000 quintillion and one
		    dinc d_loop
	      endi
	  else
		'three digits above 1E15
		dinc d_firstdigits
		dift d_firstdigits > 999: dinc d_loop
	  endi
    endw

    'construct the number
    $ch$ s_any, "0", d_countofzeros
    s_number = d_firstdigits + s_any + "1"

    'change from s_number to d_teaquadpart, d_teaquadmult
    sg_pass1 = s_number
    sub_teaquad_from_string
    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2

    'change to edited string
    dg_pass1 = d_teaquadpart
    dg_pass2 = d_teaquadmult
    sub_teaquad_to_string
    s_number = sg_pass1

    s_out = "end=" + s_number

    $out s_out
    fapp d_any, s_filename, s_out

    $dat s_dot
    dsec d_any
    d_totseconds = d_any - d_totseconds
    s_out = s_dot + ", total secs=" + d_totseconds
    
    $out s_out
    fapp d_any, s_filename, s_out

    sub_path_prog_memory

    $inp s_any, "done"
ends sub_teaquad_primes_1101


subr sub_primes_time_test
'updated 2002/12/30
'test every 10^14th number for time
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_time1, d_time2, d_time3, d_timehold, d_diff
    vari d_big, d_test, d_factor, d_number, d_increment
    vari d_many
    
    $inp s_dot, "1= to 10^13,  2= to 10^14,  3= to 10^15"
    $ift s_dot = "1"
	  dpow d_big, 10, 13
	  d_big = d_big + 10

	  dpow d_increment, 10, 11
	  d_increment = d_increment * 5
    endi
    $ift s_dot = "2"
	  dpow d_big, 10, 14
	  d_big = d_big + 10

	  dpow d_increment, 10, 12
	  d_increment = d_increment * 5
    endi
    $ift s_dot = "3"
	  dpow d_big, 10, 15
	  d_big = d_big + 10

	  dpow d_increment, 10, 13
	  d_increment = d_increment * 5
    endi

    d_many = 1
    $inp s_any, "how many times to test each"
    $isd d_any, s_any
    dift d_any = 1: $tod d_many, s_any
    d_many = d_many \ 1

    $out "number of times to test each=" + d_many

    d_timehold = 0
    d_number = 1

    dwhi d_number < d_big
	  d_test = d_number - 2

	  d_factor = 2
	  dwhi d_factor <> 1
		d_test = d_test + 2

		dfac d_factor, d_test
	  endw

	  'do d_many of them to make the test more accurate
	  d_time3 = 0
	  d_dot = 1

	  dwhi d_dot <= d_many
		dsec d_time1
		dfac d_factor, d_test
		dsec d_time2

		d_time3 = d_time3 + d_time2 - d_time1
		dinc d_dot
	  endw


	  d_time3 = d_time3 / d_many
	  d_diff = d_time3 - d_timehold
	  
	  ded$ s_any, d_test, 0, 0
	  $out s_any + "  " + d_time3 + ", diff=" + d_diff

	  d_timehold = d_time3
	  d_number = d_increment + d_number
    endw

    $inp s_any, "done"
ends sub_primes_time_test


subr sub_filename
'updated 2002/05/04
'get an output filename into sg_fileout
    vari d_any, s_any, d_dot, s_dot

    dran d_any
    dpow d_dot, 99999, 3
    d_any = d_dot * d_any

    s_any = d_any

    $lok d_dot, s_any, 1, "."
    dift d_dot > 0: $del s_any, d_dot, 1

    $ch$ s_dot, "0", 10    
    $app s_any, s_dot
    $cut s_any, s_any, 3, 7
    sg_fileout = "T" + s_any + ".txt"
ends sub_filename


subr sub_collect_5tp39xx
'updated 2009/06/05, 2009/06/03
'2009/05/12, 2009/03/03, 2009/02/28, 2009/02/26, 2009/02/01
'2009/01/29, 2009/01/24, 2008/12/22, 2008/10/20, 2008/04/15, 
'2008/04/10, 2008/02/05, 2007/08/26, 2007/08/23, 2007/08/22
'2007/07/31, 2007/07/11, 2007/07/01, 2007/06/27, 2007/06/26
    vari d_any, s_any, d_dot, s_dot
    vari s_letter, d_process, d_prevcount, s_2code, d_type
    vari s_fileout, s_filein, s_alldata, s_data, s_names
    vari d_loop, s_crlf, d_num, d_count, d_pnumct, d_tnumct

    d_process = 1
    dift d_process = 1
	  $inp s_any, "a, b, p or t files"
	  $ift s_any = "*": dinc d_process
	  $tlo s_any, s_any
	  s_letter = "b"
	  $ift s_any = "a": s_letter = s_any
	  $ift s_any = "p": s_letter = s_any
	  $ift s_any = "t": s_letter = s_any
    endi
    dift d_process = 1
	  d_type = 3
	  $inp s_any, "1=below 250E15, 2=QTP20, 3=all"
	  $ift s_any = "*": dinc d_process
	  $isd d_any, s_any
	  dift d_any = 1: $tod d_type, s_any
    endi
    dift d_process = 1
        dch$ s_crlf, 13, 1
        dch$ s_any, 10, 1
        $app s_crlf, s_any

        s_names = "a1,a2,h1,h2,h3,h4,"
	  $app s_names, "n0,n1,n2,n3,n4,n5,"
	  $app s_names, "j1,j2,d1,d2,d3,"
        $app s_names, "r1,r2,s1,s2,s3,s4,s5,s6,s7,"
        $app s_names, "x1,x2,x3,x4,x5,x6,"
	  $app s_names, "y0,y1,y2,y3,y4,y5,y6,y7,y8,y9,"
	  $app s_names, "w0,w1,w2,w3,w4,w5,w6,w7,w8,w9,"

	  'get count of previous output file
        s_fileout = s_letter + "_5tp39" + ".txt"
	  finp s_dot, s_fileout
	  $cnt d_prevcount, s_dot, "5TP39"
        fdel d_any, s_fileout

        s_alldata = sg_nothing
    endi

    d_tnumct = 0
    d_num = 1
    d_loop = 2
    dift d_process = 1
	  dift d_type = 1: d_loop = 1
	  dift d_type = 3: d_loop = 1
    endi
    dwhi d_loop = 1  
	  $par s_2code, s_names, ",", d_num
	  $trb s_2code, s_2code
	  $len d_any, s_2code
	  $ift d_any = 2
		dinc d_count

		'5tp39 files
		s_filein = s_letter + "5tp39" + s_2code + ".txt"
		finp s_data, s_filein
		$cnt d_pnumct, s_data, "5TP39"
		d_tnumct = d_tnumct + d_pnumct

		dift d_pnumct > 0
		    $len d_any, s_data
		    s_any = d_count + " " + s_filein + " " + d_any
		    $app s_any, " pnumct=" + d_pnumct
		    $out s_any

		    s_any = "file=" + s_filein + s_crlf + s_data
		    $app s_any, "file=" + s_filein + s_crlf
		    dift d_pnumct > 0: $app s_alldata, s_any
		endi
	  else
		dinc d_loop
	  endi

	  dinc d_num    
    endw

    'qtp20s
    d_num = 1
    d_loop = 2
    dift d_process = 1
	  dift d_type = 2: d_loop = 1
	  dift d_type = 3: d_loop = 1
    endi
    dwhi d_loop = 1  
	  $par s_2code, s_names, ",", d_num
	  $trb s_2code, s_2code
	  $len d_any, s_2code
	  $ift d_any = 2
		dinc d_count

		'qtp20 files
		s_filein = "qtp20" + s_2code + s_letter + ".txt"
		finp s_data, s_filein
		$cnt d_pnumct, s_data, "5TP39"
		d_tnumct = d_tnumct + d_pnumct

		dift d_pnumct > 0
		    $len d_any, s_data
		    s_any = d_count + " " + s_filein + " " + d_any
		    $app s_any, " pnumct=" + d_pnumct
		    $out s_any

		    s_any = "file=" + s_filein + s_crlf + s_data
		    $app s_any, "file=" + s_filein + s_crlf
		    dift d_pnumct > 0: $app s_alldata, s_any
		endi
	  else
		dinc d_loop
	  endi

	  dinc d_num    
    endw

    fout d_any, s_fileout, s_alldata

    s_any = "file=" + s_fileout + " length=" + d_any
    $app s_any, " ct=" + d_count + " totct=" + d_tnumct
    $out s_any

    d_any = d_tnumct - d_prevcount
    $out "previous count=" + d_prevcount + ", diff=" = d_any

    $inp s_any, "return"   
ends sub_collect_5tp39xx


subr sub_path_prog_memory
'updated 2007/12/22, 2007/12/01, 2007/11/12
'2006/09/25, 2006/09/04, 2006/08/29, 2006/04/23, 2005/10/08
    vari s_out, s_path, d_memory, s_memory
    vari s_date, s_version, d_lines, s_lines

    $sys s_version, 3
    $out s_version
    $out sg_build

    $sys s_path, 1
    $out "Path: " + s_path

    $dat s_date
    $cut s_date, s_date, 1, 20
    dsys d_memory, 1
    ded$ s_memory, d_memory, 0, 0

    dsys d_lines, 2
    ded$ s_lines, d_lines, 0, 0

    s_out = "memory=" + s_memory + ", lines=" + s_lines
    $app s_out, ", date=" + s_date
    $out s_out
ends sub_path_prog_memory


subr sub_dfac_speed_test
'updated 2003/09/29
    vari d_any, s_any, d_dot, s_dot
    vari d_sec1, d_sec2, d_maxct, d_count, d_number
    
    $out "1 = 999,090,480,521,891 prime"
    $out "2 = 999,997,874,844,049 has square root= 31,622,743"
    $inp s_any, "pick one"

    $ift s_any = "1"
        $tod d_number, "999,090,480,521,891"
    else
	  $tod d_number, "999,997,874,844,049"
    endi
    $out "number is = " + d_number

    d_maxct = 10
    $inp s_any, "how many times, 10 default"
    $isd d_any, s_any
    dift d_any = 1: $tod d_maxct, s_any

    d_count = 0
    dsec d_sec1
    dwhi d_count <= d_maxct
	  dfac d_dot, d_number
	  dinc d_count
    endw
    dsec d_sec2
    d_any = d_sec2 - d_sec1
    $out "factor=" + d_dot
    $inp s_any, "time=" + d_any
ends sub_dfac_speed_test


subr sub_xyz_math
'updated 2007/09/12, 2007/04/11, 2006/05/04
'2006/04/08, 2005/11/05, 2005/08/20, 2005/06/11, 2004/04/21
'solve a multi number math expression in sg_pass1
'the format is: x=123*567+4.6 etc or y=123*567+4.6
'put answer in dg_xvalue, dg_yvalue, dg_zvalue
    vari d_any, s_any, d_dot, s_dot, s_out, s_lok
    vari d_good, d_long, d_loop, d_error, s_dashes
    vari s_line, d_number, s_operator, d_answer, s_xyzvalue
    vari s_work, d_byte, s_term, d_process, s_command, s_aster

    s_command = sg_pass1
    $tup s_line, s_command

    $ch$ s_dashes, "-", 70
    $ift s_line = "XYZ": s_line = "X=X"

    'do we have x=, or y= or z=
    d_process = 2
    $cut s_any, s_line, 1, 2
    $ift s_any = "X=": d_process = 1 
    $ift s_any = "Y=": d_process = 1
    $ift s_any = "Z=": d_process = 1

    dwhi d_process = 1
        'x is in dg_xvalue, y is in dg_yvalue, z in dg_zvalue

	  'remove commas and blanks
	  $swp s_line, ",", sg_nothing
	  $swp s_line, " ", sg_nothing

	  'colon delimited into sg_xyzmath
	  'which holds all xyz commands to show later
	  $app sg_xyzmath, s_line + ":"

        'remove the x= or y= at the beginning in s_work
        $cut s_work, s_line, 3, 100
	  $cut s_any, s_work, 1, 1

	  'put on + if needed
	  $ift s_any <> "+"
		$ift s_any <> "-": s_work = "+" + s_work
	  endi
        $app s_work, ";"

        $len d_long, s_work
        d_error = 2
        d_byte = 2
        d_answer = 0
        d_loop = 1

        dwhi d_loop = 1
		'do we have the next operator in d_byte
	      $cut s_dot, s_work, d_byte, 1
		s_lok = "+-*/\%^@;"
	      $lok d_any, s_lok, 1, s_dot

	      dift d_any > 0
		    'we have the location of the next operator
		    d_long = d_byte - 2

		    'the current operator is in 1
		    'get the number or x,y,z
		    $cut s_term, s_work, 2, d_long

		    'is this string a number
		    $isd d_good, s_term
		    dift d_good = 1
		        $tod d_number, s_term
		    else
		        'if X then use the xvalue from previous
		        $ift s_term = "X"
			      d_number = dg_xvalue
			      d_good = 1
		        endi
		        $ift s_term = "Y"
			      d_number = dg_yvalue
			      d_good = 1
		        endi
		        $ift s_term = "Z"
			      d_number = dg_zvalue
			      d_good = 1
		        endi
			  dift d_good <> 1: d_error = 1
		    endi
		    dift d_good = 1
			  'get current operator
		        $cut s_operator, s_work, 1, 1
		    
		        $ift s_operator = "+"
				d_answer = d_answer + d_number
			  endi
		        $ift s_operator = "-"
				d_answer = d_answer - d_number
			  endi
		        $ift s_operator = "*"
				d_answer = d_answer * d_number
			  endi
		        $ift s_operator = "/"
				d_answer = d_answer / d_number
			  endi
		        $ift s_operator = "\"
				d_answer = d_answer \ d_number
			  endi
		        $ift s_operator = "^"
				dpow d_answer, d_answer, d_number
			  endi
		        $ift s_operator = "%"
				d_answer = d_answer % d_number
			  endi
		        $ift s_operator = "@"
				d_answer = d_answer @ d_number
			  endi

			  'put next operator in 1
		        $cut s_work, s_work, d_byte, 99999
		        d_byte = 1
		    endi
	      endi

	      dinc d_byte

	      $len d_long, s_work
	      dift d_byte > d_long: dinc d_loop

	      dift d_error = 1: dinc d_loop

	      'we end with a semi-colon
	      $cut s_any, s_work, 1, 1
	      $ift s_any = ";": dinc d_loop
        endw

        dift d_error = 1
            s_out = "error in expression: " + s_line
		$inp s_any, s_out
		s_line = "X=X"
        else
		$cut s_any, s_line, 1, 1
		$ift s_any = "X": dg_xvalue = d_answer
		$ift s_any = "Y": dg_yvalue = d_answer
		$ift s_any = "Z": dg_zvalue = d_answer

		'show values
		ded$ s_any, dg_xvalue, 0, 0
		s_out = "x=" + s_any
		dift dg_xvalue > 1
		    d_any = dg_xvalue \ 1
		    dift dg_xvalue = d_any
		        dfac d_any, dg_xvalue
		        dift d_any = 1: $app s_out, ":P"
		    endi
		endi

		ded$ s_any, dg_yvalue, 0, 0
		$app s_out, ", y=" + s_any
		dift dg_yvalue > 1
		    d_any = dg_yvalue \ 1
		    dift dg_yvalue = d_any
		        dfac d_any, dg_yvalue
		        dift d_any = 1: $app s_out, ":P"
		    endi
		endi

		ded$ s_any, dg_zvalue, 0, 0
		$app s_out, ", z=" + s_any
		dift dg_zvalue > 1
		    d_any = dg_zvalue \ 1
		    dift dg_zvalue = d_any
		        dfac d_any, dg_zvalue
		        dift d_any = 1: $app s_out, ":P"
		    endi
		endi

		$out s_out
		$out s_dashes

		'colon delimited into sg_xyzmath
		$app sg_xyzmath, s_out + ":"

		$inp s_line, "s=show past xyz commands"

		$tup s_line, s_line

		'do we have x=, or y=
		d_process = 2
		$cut s_any, s_line, 1, 2
		$ift s_any = "X=": d_process = 1 
		$ift s_any = "Y=": d_process = 1
		$ift s_any = "Z=": d_process = 1

		$ift s_any = "S"
		    'list from sg_xyzmath colon delimited
		    $ch$ s_aster, "*", 60
		    s_line = "X=X"

		    $out s_aster
		    d_dot = 1
		    d_loop = 1
		    dwhi d_loop = 1
			  $par s_dot, sg_xyzmath, ":", d_dot
			  $trb s_dot, s_dot
			  $ift s_dot = sg_nothing
				dinc d_loop
			  else
				$out s_dot
				dinc d_dot
			  endi
		    endw
		    $out s_aster
		    d_process = 1
		endi
	  endi
	  s_command = "none"
    endw
    sg_pass1 = s_command
ends sub_xyz_math


subr sub_teaquad_prime_duo_speed_test
'updated 2009/05/07
'test qtp20 for speed test
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_sec1, d_sec2, d_sec3
    vari s_number, d_factor
    vari d_teaquadpart, d_teaquadmult

    s_number = "10,100,000,026,832,025,221"
    $out "testing=" + s_number

    sg_pass1 = s_number
    sub_teaquad_from_string
    d_teaquadpart = dg_pass1
    d_teaquadmult = dg_pass2

    dsec d_sec1

    dduo d_factor, d_teaquadpart, d_teaquadmult

    dsec d_sec2

    $out s_number
    d_sec3 = d_sec2 - d_sec1
    d_any = d_sec3 * 5

    s_out = "factor=" + d_factor + " secs=" + d_sec3
    $app s_out, " 5x=" + d_any
    $out s_out

    $inp s_any, "return"
ends sub_teaquad_prime_duo_speed_test


subr sub_prime_test_simple
'updated 2006/08/27, 2006/08/26, 2006/08/04, 2005/02/14, 2005/02/13
'2005/02/09, 2005/02/06, 2005/01/30, 2004/11/27, 2003/04/11
'simple test dg_pass1 for prime, if prime set dg_pass1 to 1
'otherwise set dg_pass1 to the divisor
'return number of tealines in dg_pass2
    vari d_any, s_any, d_dot, s_dot
    vari d_number, d_try, d_root, d_mod
    vari d_loop, d_result

    'make positive whole number 
    d_number = dg_pass1 \ 1
    dabs d_number, d_number

    'get root of
    d_any = 1 / 2
    dpow d_root, d_number, d_any

    d_result = 1

    dift d_number > 3
        'first try 2
        d_mod = d_number % 2
        dift d_mod = 0: d_result = 2
    endi

    d_try = 3
    d_loop = d_result
    dift d_try > d_root: dinc d_loop

    dwhi d_loop = 1
	  'test d_try
	  d_mod = d_number % d_try

	  dift d_mod = 0
	      'd_number is not prime
	      dinc d_loop
	      d_result = d_try
	  else
	      d_try = d_try + 2
	      dift d_try > d_root: dinc d_loop
	  endi		
    endw

    dg_pass1 = d_result
ends sub_prime_test_simple

subr sub_speedquick
'updated 2008/02/23
    vari d_any, d_dot, d_time

    dsec d_time
    d_dot = 10 ^ 6 * 2
    d_any = 0
    dwhi d_any < d_dot
	  dinc d_any
    endw
    dsec d_any
    dg_pass1 = d_any - d_time
ends sub_speedquick


subr sub_speed98_test
'updated 2009/03/15, 2009/01/25, 2008/02/02, 2008/02/01
'2007/12/09, 2007/12/08, 2007/12/07, 2007/12/01, 2007/11/23
'2007/11/21, 2007/11/20, 2007/11/18, 2007/11/16, 2007/11/12
'2007/11/04, 2007/09/15, 2007/07/11, 2007/04/16, 2007/04/11
'2005/11/30, 2005/11/20, 2005/03/31, 2005/02/26, 2004/12/03
'speed test
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_time, d_max, d_count, d_index
    vari s_dashes, d_tseconds
    vari d_teaquadpart, d_teaquadmult

    $sys s_any, 2
    $out s_any

    $ch$ s_dashes, "-", 70

    $out s_dashes
    sub_path_prog_memory

    d_tseconds = 0

    d_max = 10000 * 10000

    'load array
    d_index = 1
    dwhi d_index <= 20000
	  dtoi d_index, d_index
	  dinc d_index
    endw
 
'dwhi dinc loop
    $out s_dashes
    d_count = 0
    dsec d_time

    dwhi d_count < d_max
	  dinc d_count
    endw

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "1.seconds=" + d_time + " dwhi dinc loop"

'dwhi +1 loop
    $out s_dashes
    d_count = 0
    dsec d_time

    dwhi d_count < d_max
	  d_count = d_count + 1
    endw

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "2.seconds=" + d_time + " dwhi +1 loop" 

'gtag dinc loop
    $out s_dashes
    d_count = 0
    dsec d_time

    gtag tag_gtagdinc
	  dinc d_count
    dift d_count < d_max: goto tag_gtagdinc

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "3.seconds=" + d_time + " gtag dinc dift loop"

'gtag +1 dift loop
    $out s_dashes
    d_count = 0
    dsec d_time

    gtag tag_gtagplusone
	  d_count = d_count + 1
    dift d_count < d_max: goto tag_gtagplusone

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "4.seconds=" + d_time + " gtag +1 dift loop"

'dwhi dift gtag loop
    $out s_dashes
    d_count = 0
    dsec d_time

    dwhi 1 = 1
	  dinc d_count
	  dift d_count >= d_max: goto tag_dwhigtag
    endw
    gtag tag_dwhigtag

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "5.seconds=" + d_time + " dwhi dift gtag" 

'gtag dift gtag loop
    $out s_dashes
    d_count = 0
    dsec d_time

    gtag tag_gtaggtag1
	  dinc d_count
	  dift d_count >= d_max: goto tag_gtaggtag2
    goto tag_gtaggtag1
    gtag tag_gtaggtag2

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "6.seconds=" + d_time + " gtag dift gtag loop" 

'gtag dift itod
    $out s_dashes
    dsec d_time

    d_dot = 10000 * 2000
    d_count = 0
    d_index = 1
    gtag tag_diftitod
        itod d_any, d_index
	  dinc d_index
	  dift d_index > 8000: d_index = 1

        dinc d_count
    dift d_count <= d_dot: goto tag_diftitod

    dsec d_any
    d_time = d_any - d_time
    d_tseconds = d_tseconds + d_time
    $out "7.seconds=" + d_time + " gtag dift itod" 

    $out s_dashes
    ded$ s_any, d_max, 0, 0
    $out "loops=" + s_any
    $out "total seconds=" + d_tseconds

    $out s_dashes

    $inp s_any, "done"
ends sub_speed98_test


subr sub_speed_test
'updated 2008/02/02, 2008/01/25, 2007/12/22, 2007/12/14
'2007/12/09, 2007/12/08, 2007/12/07, 2007/12/01, 2007/11/23
'2007/11/21, 2007/11/20, 2007/11/18, 2007/11/16, 2007/11/12
'2007/11/04, 2007/09/15, 2007/07/11, 2007/04/16, 2007/04/11
'2005/11/30, 2005/11/20, 2005/03/31, 2005/02/26, 2004/12/03
'speed test
    vari d_any, s_any, d_dot, s_dot, s_out
    vari d_count, d_max, d_index, d_time1, d_time2  
    vari s_dashes, d_tseconds
    vari d_teaquadpart, d_teaquadmult

    $sys s_any, 2
    $out s_any

    $ch$ s_dashes, "-", 70

    $out s_dashes
    sub_path_prog_memory

    d_tseconds = 0

    d_max = 10 ^ 6 * 100

'dwhi dinc loop
    $out s_dashes
    d_count = 0
    dsec d_time1

    dwhi d_count < d_max
	  dinc d_count
    endw

    dsec d_any
    d_time1 = d_any - d_time1
    d_tseconds = d_tseconds + d_time1
    ded$ s_any, d_max, 0, 0
    $out s_any + " dinc loop, seconds=" + d_time1

'dwhi +1 loop
    $out s_dashes
    d_count = 0
    dsec d_time2

    dwhi d_count < d_max
	  d_count = d_count + 1
    endw

    dsec d_any
    d_time2 = d_any - d_time2
    d_tseconds = d_tseconds + d_time2
    ded$ s_any, d_max, 0, 0
    $out s_any + "   +1 loop, seconds=" + d_time2

    $out s_dashes
    $out "total time=" + d_tseconds
    $out s_dashes

    sub_path_prog_memory

    $out s_dashes
    $inp s_any, "done"
ends sub_speed_test