'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 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=594, 2008/11/23" 
    $out sg_build
    $out "Copyright (c) 1998-2008 D La Pierre Ballard"

    $out "Written in the Teapro programming language"
    $out "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 = teaquad 5TP39 begin again, 1quad"
    $out "3 = 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"
    $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"
    $out "49 = sub_teaquad_mod_test"
    $out "51 = sub_collect_5tp39xx"
    $out "96 = sub_xyz_math"
    $out "97 = sub_teaquad_prime_speed_test"
    $out "98 = sub_speed98_test"
    $out "99 = sub_speed_test " + dg_pass1

    s_out = "pick a 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 by modulus begin again 1quad
    dift d_pick = 1
	  dg_pass1 = 1
	  sub_teaquad_5tp39_by_modulus
    endi

    '5tp39 find by modulus choose file code, beg, end
    dift d_pick = 3
	  dg_pass1 = 2
	  sub_teaquad_5tp39_by_modulus
    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

    '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
    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_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
'updated 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_out, d_ask
    vari s_test1, s_test2, s_test3, d_test
    vari d_good, s_nowdate, s_begindate, s_beginnumber, d_begseconds
    vari s_timehournew, s_timehourprev
    vari d_primetest, s_primetest
    vari d_dayteaquadpart, d_teaquadmaxpart, d_begin
    vari d_hourteaquadpart, d_pcount, d_qtpcount, d_hrcount
    vari d_billperhour, d_billion
    vari d_pivcompart, s_pivcom, d_process, d_y630
    vari d_number, s_number, d_index, d_maxindex, d_div
    vari d_filebyte, d_loop, s_record, s_file5tp39, s_line
    vari s_afile, s_bfile, d_long, d_which
    vari d_teaquadone, d_mod1, d_mod2, d_mod3
    vari d_teaquad11part, d_teaquad49part, d_teaquadmult
    vari d_tqmod11, d_tqmod13, d_tqmod17, d_tqmod19
    vari d_tqmod23, d_tqmod29, d_tqmod31, d_tqmod37, d_tqmod41

    'd_which=1 for begin again get number from file,1quad
    '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_begindate
    $cut s_begindate, s_begindate, 1, 20
    d_hrcount = 0
    d_pcount = 0
    d_qtpcount = 0

    'which filename do we want in s_afile
    'home1 office computer has s_afile = "a5tp39h1.txt"
    s_afile = "a5tp39h1.txt"
    s_bfile = "b5tp39h1.txt"
    flen d_long, s_afile

    dift d_long < 0
	  'home2 office computer has s_afile = "a5tp39h2.txt"
        s_afile = "a5tp39h2.txt"
        s_bfile = "b5tp39h2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'home3 office computer has s_afile = "a5tp39h3.txt"
        s_afile = "a5tp39h3.txt"
        s_bfile = "b5tp39h3.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'home4 office computer has s_afile = "a5tp39h4.txt"
        s_afile = "a5tp39h4.txt"
        s_bfile = "b5tp39h4.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work D's computer has s_afile = "a5tp39d1.txt"
        s_afile = "a5tp39d1.txt"
        s_bfile = "b5tp39d1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work D's computer has s_afile = "a5tp39d2.txt"
        s_afile = "a5tp39d2.txt"
        s_bfile = "b5tp39d2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work D's computer has s_afile = "a5tp39d3.txt"
        s_afile = "a5tp39d3.txt"
        s_bfile = "b5tp39d3.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'home A's computer has s_afile = "a5tp39a1.txt"
        s_afile = "a5tp39a1.txt"
        s_bfile = "b5tp39a1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'home A's computer has s_afile = "a5tp39a2.txt"
        s_afile = "a5tp39a2.txt"
        s_bfile = "b5tp39a2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'home J's computer has s_afile = "a5tp39j1.txt"
        s_afile = "a5tp39j1.txt"
        s_bfile = "b5tp39j1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'home J's computer has s_afile = "a5tp39j2.txt"
        s_afile = "a5tp39j2.txt"
        s_bfile = "b5tp39j2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work Linux computer has s_afile = "a5tp39x1.txt"
        s_afile = "a5tp39x1.txt"
        s_bfile = "b5tp39x1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work Linux computer has s_afile = "a5tp39x2.txt"
        s_afile = "a5tp39x2.txt"
        s_bfile = "b5tp39x2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work Linux computer has s_afile = "a5tp39x3.txt"
        s_afile = "a5tp39x3.txt"
        s_bfile = "b5tp39x3.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work Linux computer has s_afile = "a5tp39x4.txt"
        s_afile = "a5tp39x4.txt"
        s_bfile = "b5tp39x4.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work Linux computer has s_afile = "a5tp39x5.txt"
        s_afile = "a5tp39x5.txt"
        s_bfile = "b5tp39x5.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work Linux computer has s_afile = "a5tp39x6.txt"
        s_afile = "a5tp39x6.txt"
        s_bfile = "b5tp39x6.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work R's computer has s_afile = "a5tp39r1.txt"
        s_afile = "a5tp39r1.txt"
        s_bfile = "b5tp39r1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'work R's computer has s_afile = "a5tp39r2.txt"
        s_afile = "a5tp39r2.txt"
        s_bfile = "b5tp39r2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'notebook computer Alice has s_afile = "a5tp39n1.txt"
        s_afile = "a5tp39n1.txt"
        s_bfile = "b5tp39n1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'notebook computer Alice has s_afile = "a5tp39n2.txt"
        s_afile = "a5tp39n2.txt"
        s_bfile = "b5tp39n2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'notebook computer Scotty has s_afile = "a5tp39n3.txt"
        s_afile = "a5tp39n3.txt"
        s_bfile = "b5tp39n3.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'notebook computer Scotty has s_afile = "a5tp39n4.txt"
        s_afile = "a5tp39n4.txt"
        s_bfile = "b5tp39n4.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'notebook computer A's new has s_afile = "a5tp39n5.txt"
        s_afile = "a5tp39n5.txt"
        s_bfile = "b5tp39n5.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super1 has s_afile = "a5tp39s1.txt"
        s_afile = "a5tp39s1.txt"
        s_bfile = "b5tp39s1.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super2 has s_afile = "a5tp39s2.txt"
        s_afile = "a5tp39s2.txt"
        s_bfile = "b5tp39s2.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super3 has s_afile = "a5tp39s3.txt"
        s_afile = "a5tp39s3.txt"
        s_bfile = "b5tp39s3.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super4 has s_afile = "a5tp39s4.txt"
        s_afile = "a5tp39s4.txt"
        s_bfile = "b5tp39s4.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super5 has s_afile = "a5tp39s5.txt"
        s_afile = "a5tp39s5.txt"
        s_bfile = "b5tp39s5.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super6 has s_afile = "a5tp39s6.txt"
        s_afile = "a5tp39s6.txt"
        s_bfile = "b5tp39s6.txt"
        flen d_long, s_afile
    endi
    dift d_long < 0
	  'super7 has s_afile = "a5tp39s7.txt"
        s_afile = "a5tp39s7.txt"
        s_bfile = "b5tp39s7.txt"
        flen d_long, s_afile
    endi

    'd_which=1 for begin again get number from file,1quad
    'd_which=2 for enter file code, beg, end
    d_ask = 2
    dift d_which = 2: d_ask = 1
    dift d_long < 0
	  d_ask = 1
        s_afile = "a5tp39zz.txt"
        s_bfile = "b5tp39zz.txt"
    endi
    dift d_ask = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  'ask for file code
	  $out "a1,a2,d1,d2,d3,h1,h2,h3,n1,n2,n3,n4,n5"
        $out "s1,s2,s3,s4,s5,s6,r1,r2,x1,x2,x3,x4,x5,x6"
	  $out "default files=" + s_afile + " and " + s_bfile

	  s_any = "enter different two letter file code, "
	  $app s_any, "return for default"
	  $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_afile = "a5tp39" + s_any + ".txt"
		s_bfile = "b5tp39" + s_any + ".txt"
	  endi
    endi
    dift d_process = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  '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
		    $trb s_record, s_record
		    $app s_record, " "
		    $lok d_any, s_record, 1, " "
		    $cut s_any, s_record, 1, d_any

		    'is this a 5tp39 found last time
		    $cut s_dot, s_record, d_any, 999
		    $trb s_dot, s_dot
		    $len d_dot, s_dot

		    '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
			  dift d_dot = 0
				'number found was a 5tp39 
				'we do not want it again
				d_teaquad11part = d_teaquad11part + 420
			  endi
		    endi
		endi	 
	  endw

	  '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 "file=" + s_line
	  dift d_teaquad11part = 0: d_ask = 1
    endi
    dift d_ask = 1
	  $ch$ s_any, "-", 70
	  $out s_any

	  'ask for beginning number
        $out "files=" + s_afile + " and " + s_bfile

	  'enter beginning number
	  s_test1 = "99,999,900,000,000,000"
	  s_test2 = "100,999,900,000,000,000"
	  s_test3 = "1,999,900,000,000,000"

	  $out "test1=" + s_test1
	  $out "test2=" + s_test2
	  $out "test3=" + s_test3
	  $out "E15=in quadrillions"

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

        s_any = "12345678901234567890123, or test1,test2,test3"
	  $inp s_any, s_any
	  $ift s_any = "*": dinc d_process

	  d_test = 0
	  $tup s_any, s_any

	  $ift s_any = "TEST1": d_test = 1
	  $ift s_any = "TEST2": d_test = 2
	  $ift s_any = "TEST3": d_test = 3
	  
	  $ift s_any = "TEST1": s_any = s_test1
	  $ift s_any = "TEST2": s_any = s_test2
	  $ift s_any = "TEST3": s_any = s_test3
	  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

	  '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_nowdate
        $cut s_nowdate, s_nowdate, 1, 20

	  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_nowdate
	  $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 = 10000
        d_number = 43
        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_dot, d_maxindex
	  s_any = "array from=" + d_any + " to " + d_dot
	  $app s_any, " ct=" + d_maxindex
	  $out s_any

        s_timehourprev = "x"
        d_hourteaquadpart = 0
    endi
    dift d_process = 1
	  $ch$ s_any, "-", 70
	  $out s_any

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

	  '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
    endi
    d_tqmod11 = d_teaquadone % 11 * d_teaquadmult
    d_tqmod13 = d_teaquadone % 13 * d_teaquadmult
    d_tqmod17 = d_teaquadone % 17 * d_teaquadmult
    d_tqmod19 = d_teaquadone % 19 * d_teaquadmult
    d_tqmod23 = d_teaquadone % 23 * d_teaquadmult
    d_tqmod29 = d_teaquadone % 29 * d_teaquadmult
    d_tqmod31 = d_teaquadone % 31 * d_teaquadmult
    d_tqmod37 = d_teaquadone % 37 * d_teaquadmult
    d_tqmod41 = d_teaquadone % 41 * d_teaquadmult

    '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

    $dat s_any
    s_out = "beg=" + s_any
    $out s_out
    fapp d_any, s_afile, s_out
    dbad d_any = 0

    d_dayteaquadpart = d_teaquad49part - 38

    dsec d_begseconds

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_teaquadone % 13 = 12
    d_mod1 = d_tqmod13 + 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_teaquadone % 17 = 12
    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_teaquadone % 19 = 8
    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_teaquadone % 23 = 5
    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_teaquadone % 29 = 19
    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_teaquadone % 31 = 1
    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_teaquadone % 37 = 1
    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_teaquadone % 41 = 1
    d_mod1 = d_tqmod41 + d_teaquad49part % 41
    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
    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

    '43 is in the array with index=1
    d_index = 1
    dwhi d_index <= d_maxindex
        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 = 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
            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
	  dinc d_index
    endw

    'test the p11 number
    d_teaquad11part = d_teaquad49part - 38
    dfak d_good, d_teaquad11part, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'we have a prime beginning
    dinc d_pcount

    'get second digit of the hour to test for hour change
    '12345678901234567890123456789012345
    '17-DEC-2002 03:56:22 20021217035622
    $dat s_nowdate
    $cut s_timehournew, s_nowdate, 13, 2

    'get s_nowdate
    '12345678901234567890123456789012345
    '17-DEC-2002 03:56:22 20021217035622
    $cut s_nowdate, s_nowdate, 1, 20

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

    $ift s_timehournew <> s_timehourprev
	  'we have new hour
	  s_timehourprev = s_timehournew
	  dinc d_hrcount

	  'get d_billperhour change
	  d_dot = d_teaquad11part - d_hourteaquadpart

	  'first time through we want zero
	  dift d_hourteaquadpart = 0: d_dot = 0

	  d_hourteaquadpart = d_teaquad11part

	  'divide by a billion and round to a whole number
	  d_billperhour = d_dot / d_billion @ 0

	  $app s_out, " bph:" + d_billperhour + " " + d_hrcount

	  $app s_out, " " + d_qtpcount + " " + d_pcount
	  d_pcount = 0

	  fapp d_any, s_afile, s_out
	  dbad d_any = 0

        $out s_out

	  $ift s_timehournew = "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_begindate
		$app s_out, " " + d_qtpcount

	      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 not prorate
		'get trillion per day
		d_dot = 10 ^ 12
		d_any = d_any / d_dot
		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

	  '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_nowdate + " " + d_pcount
        $out s_out

        dift d_test > 0
		$out s_test1
		dsec d_any
		d_any = d_any - d_begseconds
		$out "test" + d_test + " seconds=" + d_any

		$inp s_any, "stop"
		goto tag_endsubr
        endi

	  'output beginning and ending dates and afile
	  s_out = "beg=" + s_begindate
	  $app s_out, " end=" + s_nowdate
	  $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
	  $cut s_any, s_afile, 7, 1
	  d_dot = 1
	  $ift s_any = "j": dinc d_dot
	  $ift s_any = "r": 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_teaquadone is 1E15 or 10^15
	  dinc d_teaquadmult

	  'initialize various counters
	  d_dayteaquadpart = 0
	  d_hrcount = 0
	  d_qtpcount = 0
	  d_pcount = 0

        d_tqmod11 = d_teaquadone % 11 * d_teaquadmult
        d_tqmod13 = d_teaquadone % 13 * d_teaquadmult
        d_tqmod17 = d_teaquadone % 17 * d_teaquadmult
        d_tqmod19 = d_teaquadone % 19 * d_teaquadmult
        d_tqmod23 = d_teaquadone % 23 * d_teaquadmult
        d_tqmod29 = d_teaquadone % 29 * d_teaquadmult
        d_tqmod31 = d_teaquadone % 31 * d_teaquadmult
        d_tqmod37 = d_teaquadone % 37 * d_teaquadmult
        d_tqmod41 = d_teaquadone % 41 * d_teaquadmult

	  d_teaquad11part = d_teaquad11part - d_teaquadone
	  d_teaquad49part = d_teaquad49part - d_teaquadone
    endi

    'test the p13 number
    d_any = d_teaquad11part + 2
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'test the p17 number
    d_any = d_teaquad11part + 6
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'test the p19 number
    d_any = d_teaquad11part + 8
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'test the p29 number
    d_any = d_teaquad11part + 18
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'test the p31 number
    d_any = d_teaquad11part + 20
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'test the p41 number
    d_any = d_teaquad11part + 30
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber
					 	
    'test the p43 number
    d_any = d_teaquad11part + 32
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber
						  
    'test the p47 number
    d_any = d_teaquad11part + 36
    dfak d_good, d_any, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    'test the p49 number
    dfak d_good, d_teaquad49part, d_teaquadmult
    dift d_good <> 1: goto tag_nextnumber

    '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_nowdate
    $cut s_nowdate, s_nowdate, 1, 20

    s_out = "] 000:5TP39= " + s_primetest
    $app s_out, "  " + s_nowdate + " " + 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


subr sub_5tp39_two_files_compare
'updated 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_nofindfile, d_nostop
    vari d_ctdata1, d_ctdata2

    $ch$ s_dashes, "-", 70
    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=nofind.txt"
	  $ift s_any = "*": dinc d_process
	  d_nofindfile = 2
	  $ift s_any = "1"
		d_nofindfile = 1
		fdel d_any, "nofind.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_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

		'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: $out s_any + "E15" + s_dashes
		endi
		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_nofindfile = 1
			  fapp d_any, "nofind.txt", s_out
			  dbad d_any = 0
		    endi

		    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
'updated 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
		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
		dfak 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

		'13
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 2
		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
		dfak 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
		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
		dfak 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

		'19
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 8
		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
		dfak 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
		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
		dfak 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

		'31
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 20
		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
		dfak 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
		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
		dfak 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

		'43
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 32
		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
		dfak 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
		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
		dfak 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

		'49
		dinc d_count
		d_tryteaquadpart = d_teaquadpart + 38
		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
		dfak 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


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 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
    $out s_any + s_out
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
'updated 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
	  dfak d_factor, d_teaquadpart, d_teaquadmult

	  d_any = d_teaquadpart + 2
	  dift d_factor = 1: dfak d_factor, d_any, d_teaquadmult

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

	  d_any = d_teaquadpart + 8
	  dift d_factor = 1: dfak 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


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_strin