test/Tools/isac/Knowledge/gcd_poly_ml.sml
author Walther Neuper <neuper@ist.tugraz.at>
Mon, 02 Sep 2013 14:56:57 +0200
changeset 52099 2a95fc276d0a
parent 52098 bb49dd92fa04
child 59368 c69a314184f3
permissions -rw-r--r--
GCD_Poly_ML: generalised gcd_poly handling monomials

this also fixes bug in 6ceee9c5d6fd, which had been fixed in bb49dd92fa04 half-assed.
meindl_diana@48797
     1
(* Title: test/../rational2
meindl_diana@48797
     2
   Author: Diana Meindl
meindl_diana@48797
     3
   Copyright (c) Diana Meindl 2011
meindl_diana@48797
     4
12345678901234567890123456789012345678901234567890123456789012345678901234567890
meindl_diana@48797
     5
        10        20        30        40        50        60        70        80
meindl_diana@48797
     6
*)
meindl_diana@48797
     7
neuper@52074
     8
(*fun nth _ []      = error "nth _ []" (*Isabelle2002, still saved the hours of update*)
neuper@52074
     9
    | nth 1 (x::_) = x
neuper@52074
    10
    | nth n (_::xs) = nth (n-1) xs;*)
neuper@52074
    11
  fun nth xs i = List.nth (xs, i);     (*recent Isabelle: TODO update all isac code   *)
meindl_diana@48797
    12
meindl_diana@48797
    13
"--------------------------------------------------------";
neuper@48853
    14
"table of contents --------------------------------------";
meindl_diana@48797
    15
"--------------------------------------------------------";
neuper@48813
    16
"----------- fun div2 -- --------------------------------";
meindl_diana@48797
    17
"----------- fun mod_inv --------------------------------";
neuper@48814
    18
"----------- fun mod_div --------------------------------";
neuper@48813
    19
"----------- fun chinese_remainder ----------------------";
neuper@48830
    20
"----------- fun is_prime -------------------------------";
neuper@48830
    21
"----------- fun make_primes ----------------------------";
neuper@48814
    22
"----------- fun primes_upto ----------------------------";
neuper@48834
    23
"----------- fun next_prime_not_dvd ---------------------";
neuper@48853
    24
"----------- fun lcoeff_up ------------------------------";
neuper@48853
    25
"----------- fun deg_up ---------------------------------";
neuper@48853
    26
"----------- fun drop_lc0_up ----------------------------";
neuper@48815
    27
"----------- fun normalise ------------------------------";
neuper@48814
    28
(* order until here: (GCD_Poly_FP =) GCD_Poly = gcd_poly *)
meindl_diana@48797
    29
"----------- fun %* -------------------------------------";
meindl_diana@48797
    30
"----------- fun %/ -------------------------------------";
meindl_diana@48797
    31
"----------- fun %-% ------------------------------------";
neuper@48815
    32
"----------- fun %|% ------------------------------------";
meindl_diana@48810
    33
(*"----------- fun %+% ------------------------------------";*)
neuper@48855
    34
(*"----------- fun centr_up -----------------------------";*)
neuper@48830
    35
"----------- fun LANDAU_MIGNOTTE_bound ------------------";
neuper@48855
    36
"----------- fun chinese_remainder_up -------------------";
neuper@48857
    37
"----------- fun mod_up ---------------------------------";
neuper@48857
    38
"----------- fun mod_up_gcd -----------------------------";
neuper@48855
    39
"----------- fun primitive_up ---------------------------";
neuper@48855
    40
"----------- fun try_new_prime_up -----------------------";
neuper@48855
    41
"----------- fun gcd_up ---------------------------------";
neuper@48813
    42
"=========== Multivariate Case ==========================";
neuper@48853
    43
"----------- fun lcoeff ---------------------------------";
neuper@48853
    44
"----------- fun lexp -----------------------------------";
neuper@48853
    45
"----------- fun add_variable ---------------------------";
neuper@48870
    46
"----------- fun zero_poly ------------------------------";
neuper@48853
    47
"----------- drop_lc0 -----------------------------------";
neuper@48853
    48
"----------- fun add_monoms -----------------------------";
neuper@48853
    49
"----------- fun lex_ord --------------------------------";
neuper@48853
    50
"----------- fun order ----------------------------------";
neuper@48846
    51
(*"----------- fun lcoeff_up_poly ---------------------------";*)
neuper@48853
    52
"----------- fun lexp -----------------------------------";
meindl_diana@48797
    53
"----------- fun max_deg_var ----------------------------";
meindl_diana@48797
    54
"----------- infix %%/ ----------------------------------";
neuper@48853
    55
"----------- infix %%*%% --------------------------------";
neuper@48853
    56
"----------- fun gcd_coeff ------------------------------";
neuper@48850
    57
(*"----------- fun gcd_coeff_poly -------------------------";*)
neuper@48854
    58
"----------- fun eval -----------------------------------";
neuper@48850
    59
"----------- fun multi_to_uni ---------------------------";
neuper@48850
    60
"----------- fun uni_to_multi ---------------------------";
meindl_diana@48797
    61
"----------- fun find_new_r  ----------------------------";
meindl_diana@48797
    62
"----------- fun mult_with_new_var  ---------------------";
neuper@48846
    63
(*"----------- fun greater_deg  -----------------";*)
meindl_diana@48797
    64
"----------- infix %%+%%  -------------------------------";
meindl_diana@48797
    65
"----------- infix %%-%%  -------------------------------";
meindl_diana@48797
    66
"----------- infix %%*%%  -------------------------------";
neuper@48851
    67
"----------- infix %%/%%  -------------------------------";
meindl_diana@48797
    68
"----------- fun newton_first  --------------------------";
neuper@48853
    69
"----------- fun NEWTON  --------------------------------";
neuper@48853
    70
"----------- fun all_geq  -------------------------------";
neuper@48853
    71
"----------- fun greater_deg  ---------------------------";
neuper@52097
    72
"----------- infix %%|%% --------------------------------";
neuper@48813
    73
"----------- fun gcd_poly'  -----------------------------";
neuper@48813
    74
"----------- fun gcd_poly  ------------------------------";
neuper@52097
    75
"----------- fun gcd_poly downto division by zero -------";
neuper@52063
    76
"=========== prep Lucas-Interpretation ==================";
neuper@52077
    77
"----------- fun for_quot_regarding ---------------------";
neuper@52077
    78
"----------- fun mult_to_deg - --------------------------";
neuper@52063
    79
"----------- fun fact_quot ------------------------------";
neuper@52063
    80
"----------- fun %+% ------------------------------------";
neuper@52063
    81
"----------- fun %*% ------------------------------------";
neuper@52063
    82
"----------- fun %*/% -----------------------------------";
neuper@52077
    83
"----------- fun %*/% Subscript raised (line 509 of lib--";
neuper@52063
    84
"----------- fun EUCLID_naive_up ------------------------";
neuper@52080
    85
"----------- last step in EUCLID ------------------------";
neuper@48813
    86
" ========== END ======================================= ";
meindl_diana@48797
    87
meindl_diana@48797
    88
neuper@48813
    89
"----------- fun div2 -- --------------------------------";
neuper@48813
    90
"----------- fun div2 -- --------------------------------";
neuper@48813
    91
"----------- fun div2 -- --------------------------------";
meindl_diana@48810
    92
meindl_diana@48810
    93
if 5 div 2 = 2 then () else error "5 div 2 = 2 changed";
neuper@48813
    94
if (5 div2 2) = 2 then () else error "5 div2 2 = 2 changed";
meindl_diana@48810
    95
if ~5 div 2 = ~3 then () else error "~5 div 2 = ~3 changed";
neuper@48813
    96
if (~5 div2 2) = ~2 then () else error "~5 div2 2 = ~2 changed";
meindl_diana@48810
    97
if ~5 div ~2 = 2 then () else error "~5 div ~2 = 2 changed";
neuper@48813
    98
if (~5 div2 ~2) = 2 then () else error "~5 div2 ~2 = 2 changed";
meindl_diana@48810
    99
if 5 div ~2 = ~3 then () else error "5 div ~2 = ~3 changed";
neuper@48813
   100
if (5 div2 ~2) = ~2 then () else error "5 div2 ~2 = ~2 changed";
meindl_diana@48810
   101
meindl_diana@48810
   102
meindl_diana@48797
   103
"----------- fun mod_inv --------------------------------";
meindl_diana@48797
   104
"----------- fun mod_inv --------------------------------";
meindl_diana@48797
   105
"----------- fun mod_inv--- -----------------------------";
meindl_diana@48797
   106
"~~~~~ fun mod_inv, args:"; val (r, m) = (5,7);
meindl_diana@48797
   107
"~~~~~ fun modi, args:"; val (r, rold, m, rinv) = (r, r, m, 1);
meindl_diana@48797
   108
rinv < m; (*=true*)
meindl_diana@48797
   109
r mod m = 1; (*=false*)
meindl_diana@48797
   110
"~~~~~ fun modi, args:"; val (r, rold, m, rinv) = (rold * (rinv + 1), rold, m, rinv + 1);
meindl_diana@48797
   111
rinv < m;(*=true*)
meindl_diana@48797
   112
r mod m = 1; (*=false*)
meindl_diana@48797
   113
"~~~~~ fun modi, args:"; val (r, rold, m, rinv) = (rold * (rinv + 1), rold, m, rinv + 1);
meindl_diana@48797
   114
rinv < m;(*=true*)
meindl_diana@48797
   115
r mod m = 1; (*=true*)
meindl_diana@48797
   116
"~~~~~ to mod_inv return val:"; val (rinv) = (rinv);
meindl_diana@48797
   117
meindl_diana@48797
   118
if mod_inv 5 7 = 3 then () else error "mod_inv 5 7 = 3 changed";
meindl_diana@48797
   119
if mod_inv 3 7 = 5 then () else error "mod_inv 3 7 = 5 changed";
meindl_diana@48797
   120
if mod_inv 4 339 = 85 then () else error "mod_inv 4 339 = 85 changed";
meindl_diana@48797
   121
neuper@48814
   122
"----------- fun mod_div --------------------------------";
neuper@48814
   123
"----------- fun mod_div --------------------------------";
neuper@48814
   124
"----------- fun mod_div --------------------------------";
neuper@48865
   125
if mod_div 21 3 5 = 2 then () else error "mod_div changed";  21 mod 5 = (3 * 2) mod 5;
neuper@48865
   126
if mod_div 22 3 5 = 4 then () else error "mod_div changed";  22 mod 5 = (3 * 4) mod 5;
neuper@48865
   127
if mod_div 23 3 5 = 1 then () else error "mod_div changed";  23 mod 5 = (3 * 1) mod 5;
neuper@48865
   128
if mod_div 24 3 5 = 3 then () else error "mod_div changed";  24 mod 5 = (3 * 3) mod 5;
neuper@48865
   129
if mod_div 25 3 5 = 0 then () else error "mod_div changed";  25 mod 5 = (3 * 0) mod 5;
neuper@48865
   130
neuper@48814
   131
if mod_div 21 4 5 = 4 then () else error "mod_div 21 4 5 = 4 changed";
neuper@48814
   132
if mod_div 1 4 5 = 4 then () else error "mod_div 1 4 5 = 4 changed";
neuper@48814
   133
if mod_div 0 4 5 = 0 then () else error "mod_div 0 4 5 = 0 changed";
neuper@48814
   134
neuper@48813
   135
"----------- fun chinese_remainder ----------------------";
neuper@48813
   136
"----------- fun chinese_remainder ----------------------";
neuper@48813
   137
"----------- fun chinese_remainder ----------------------";
meindl_diana@48797
   138
neuper@48862
   139
if  chinese_remainder(17,9) (3,4) = 35 then () else error "chinese_remainder(17,9)(3,4)=35 changed"; 
neuper@48862
   140
if  chinese_remainder(7,2) (6,11) = 17 then () else error "chinese_remainder(7,2)(6,11)=17 changed";  
meindl_diana@48797
   141
neuper@48830
   142
"----------- fun is_prime -------------------------------";
neuper@48830
   143
"----------- fun is_prime -------------------------------";
neuper@48830
   144
"----------- fun is_prime -------------------------------";
neuper@48830
   145
if is_prime [2, 3] 2  = false then () else error "is_prime changed";
neuper@48830
   146
if is_prime [2, 3] 3  = false then () else error "is_prime changed";
neuper@48830
   147
if is_prime [2, 3] 4  = false then () else error "is_prime changed";
neuper@48830
   148
if is_prime [2, 3] 5  = true then () else error "is_prime changed";
neuper@48830
   149
if is_prime [2, 3, 5] 5  = false then () else error "is_prime changed";
neuper@48830
   150
if is_prime [2, 3] 6  = false then () else error "is_prime changed";
neuper@48830
   151
if is_prime [2, 3] 7  = true then () else error "is_prime changed";
neuper@48830
   152
if is_prime [2, 3] 25  = true then () else error "is_prime changed";
neuper@48830
   153
neuper@48830
   154
"----------- fun make_primes ----------------------------";
neuper@48830
   155
"----------- fun make_primes ----------------------------";
neuper@48830
   156
"----------- fun make_primes ----------------------------";
neuper@48830
   157
if make_primes [2, 3] 3 4 = [2, 3, 5] then () else error "make_primes changed";
neuper@48830
   158
if make_primes [2, 3] 3 5 = [2, 3, 5] then () else error "make_primes changed";
neuper@48830
   159
if make_primes [2, 3] 3 6 = [2, 3, 5, 7] then () else error "make_primes changed";
neuper@48830
   160
if make_primes [2, 3] 3 7 = [2, 3, 5, 7] then () else error "make_primes changed";
neuper@48830
   161
if make_primes [2, 3] 3 8 = [2, 3, 5, 7, 11] then () else error "make_primes changed";
neuper@48830
   162
if make_primes [2, 3] 3 9 = [2, 3, 5, 7, 11] then () else error "make_primes changed";
neuper@48830
   163
if make_primes [2, 3] 3 10 = [2, 3, 5, 7, 11] then () else error "make_primes changed";
neuper@48830
   164
if make_primes [2, 3] 3 11 = [2, 3, 5, 7, 11] then () else error "make_primes changed";
neuper@48830
   165
if make_primes [2, 3] 3 12 = [2, 3, 5, 7, 11, 13] then () else error "make_primes changed";
neuper@48830
   166
if make_primes [2, 3] 3 13 = [2, 3, 5, 7, 11, 13] then () else error "make_primes changed";
neuper@48830
   167
if make_primes [2, 3] 3 14 = [2, 3, 5, 7, 11, 13, 17] then () else error "make_primes changed";
neuper@48830
   168
if make_primes [2, 3] 3 15 = [2, 3, 5, 7, 11, 13, 17] then () else error "make_primes changed";
neuper@48830
   169
if make_primes [2, 3] 3 16 = [2, 3, 5, 7, 11, 13, 17] then () else error "make_primes changed";
neuper@48830
   170
if make_primes [2, 3] 3 17 = [2, 3, 5, 7, 11, 13, 17] then () else error "make_primes changed";
neuper@48830
   171
if make_primes [2, 3] 3 18 = [2, 3, 5, 7, 11, 13, 17, 19] then () else error "make_primes changed";
neuper@48830
   172
if make_primes [2, 3] 3 19 = [2, 3, 5, 7, 11, 13, 17, 19] then () else error "make_primes changed";
neuper@48830
   173
if make_primes [2, 3, 5, 7] 7 4 = [2, 3, 5, 7] then () else error "make_primes changed";
neuper@48830
   174
neuper@48814
   175
"----------- fun primes_upto ----------------------------";
neuper@48814
   176
"----------- fun primes_upto ----------------------------";
neuper@48814
   177
"----------- fun primes_upto ----------------------------";
neuper@48835
   178
if primes_upto 1 = [2] then () else error " primes_upto 1 = [2] changed";
neuper@48835
   179
if primes_upto 3 = [2,3] then () else error " primes_upto 3 = [2,3] changed";
neuper@48835
   180
if primes_upto 6 = [2,3,5,7] then () else error " primes_upto 6 = [2,3,5,7] changed";
neuper@48835
   181
if primes_upto 7 = [2,3,5,7] then () else error " primes_upto 7 = [2,3,5,7] changed";
meindl_diana@48797
   182
neuper@48827
   183
"----------- fun next_prime_not_dvd ----------------";
neuper@48827
   184
"----------- fun next_prime_not_dvd ----------------";
neuper@48827
   185
"----------- fun next_prime_not_dvd ----------------";
neuper@48835
   186
if ( 1 next_prime_not_dvd 15) =  2 then () else error "next_prime_not_dvd ..changed";
neuper@48835
   187
if ( 2 next_prime_not_dvd 15) =  7 then () else error "next_prime_not_dvd ..changed";
neuper@48835
   188
if ( 3 next_prime_not_dvd 15) =  7 then () else error "next_prime_not_dvd ..changed";
neuper@48835
   189
if ( 4 next_prime_not_dvd 15) =  7 then () else error "next_prime_not_dvd ..changed";
neuper@48835
   190
if ( 5 next_prime_not_dvd 15) =  7 then () else error "next_prime_not_dvd ..changed";
neuper@48835
   191
if ( 6 next_prime_not_dvd 15) =  7 then () else error "next_prime_not_dvd ..changed";
neuper@48835
   192
if ( 7 next_prime_not_dvd 15) = 11 then () else error "next_prime_not_dvd ..changed";
meindl_diana@48797
   193
neuper@48853
   194
"----------- fun lcoeff_up ------------------------------";
neuper@48853
   195
"----------- fun lcoeff_up ------------------------------";
neuper@48853
   196
"----------- fun lcoeff_up ------------------------------";
neuper@48846
   197
if lcoeff_up [3,4,5,6] = 6 then () else error "lcoeff_up (3,4,5,6) = 6 changed" ;
neuper@48846
   198
if lcoeff_up [3,4,5,6,0] = 6 then () else error "lcoeff_up (3,4,5,6,0) = 6 changed"  ;
neuper@48814
   199
neuper@48853
   200
"----------- fun deg_up ---------------------------------";
neuper@48853
   201
"----------- fun deg_up ---------------------------------";
neuper@48853
   202
"----------- fun deg_up ---------------------------------";
neuper@48846
   203
if deg_up [3,4,5,6] = 3 then () else error "deg_up [3,4,5,6] = 3 changed" ;
neuper@48846
   204
if deg_up [3,4,5,6,0] = 3 then () else error "deg_up [3,4,5,6,0] = 3 changed";
neuper@48814
   205
neuper@48853
   206
"----------- fun drop_lc0_up ----------------------------";
neuper@48853
   207
"----------- fun drop_lc0_up ----------------------------";
neuper@48853
   208
"----------- fun drop_lc0_up ----------------------------";
neuper@48846
   209
if drop_lc0_up [0, 1, 2, 3, 4, 5, 0, 0] = [0, 1, 2, 3, 4, 5] then ()
neuper@48846
   210
else error "drop_lc0_up [0, 1, 2, 3, 4, 5, 0, 0] = [0, 1, 2, 3, 4, 5] changed";
neuper@48846
   211
if drop_lc0_up [0, 1, 2, 3, 4, 5] = [0, 1, 2, 3, 4, 5] then () 
neuper@48846
   212
else error "drop_lc0_up [0, 1, 2, 3, 4, 5]=[0, 1, 2, 3, 4, 5] changed";
neuper@48814
   213
neuper@48815
   214
"----------- fun normalise ------------------------------";
neuper@48815
   215
"----------- fun normalise ------------------------------";
neuper@48815
   216
"----------- fun normalise ------------------------------";
neuper@48815
   217
if (normalise [~18, ~15, ~20, 12, 20, ~13, 2] 5) = [1, 0, 0, 1, 0, 1, 1 ] then ()
neuper@48815
   218
else error "(normalise [~18, ~15, ~20, 12, 20, ~13, 2] 5) = [1, 0, 0, 1, 0, 1, 1 ] changed"
meindl_diana@48797
   219
meindl_diana@48797
   220
"----------- fun %* ------------------------------";
meindl_diana@48797
   221
"----------- fun %* ------------------------------";
meindl_diana@48797
   222
"----------- fun %* ------------------------------";
neuper@48815
   223
if ([5, 4, 7, 8, 1] %* 5) = [25, 20, 35, 40, 5] then () 
neuper@48815
   224
else error "[5, 4, 7, 8, 1] %* 5 = [25, 20, 35, 40, 5] changed";
neuper@48815
   225
if ([5, 4, ~7, 8, ~1] %* 5) = [25, 20, ~35, 40, ~5] then () 
neuper@48815
   226
else error "[5, 4, ~7, 8, ~1] %* 5 = [25, 20, ~35, 40, ~5] changed";
meindl_diana@48797
   227
meindl_diana@48797
   228
"----------- fun %/ -------------------------------";
meindl_diana@48797
   229
"----------- fun %/ -------------------------------";
meindl_diana@48797
   230
"----------- fun %/ -------------------------------";
neuper@48815
   231
if ([4, 3, 2, 5, 6] %/ 3) = [1, 1, 0, 1, 2] then ()
neuper@48815
   232
else error "%/ [4, 3, 2, 5, 6] 3 = [1, 1, 0, 1, 2] changed";
neuper@48815
   233
if ([4, 3, 2, 0] %/ 3) = [1, 1, 0, 0] then () 
neuper@48815
   234
else error "%/ [4, 3, 2, 0] 3 = [1, 1, 0, 0] changed";
meindl_diana@48797
   235
neuper@48815
   236
"----------- fun %-% ------------------------------";
neuper@48815
   237
"----------- fun %-% ------------------------------";
neuper@48815
   238
"----------- fun %-% -----------------------------";
neuper@48815
   239
if ([8, ~7, 0, 1] %-% [~2, 2, 3, 0]) = [10, ~9, ~3, 1] then () 
neuper@48815
   240
else error "([8, ~7, 0, 1] %-% [~2, 2, 3, 0]) = [10, ~9, ~3, 1] changed";
neuper@48815
   241
if ([8, 7, 6, 5, 4] %-% [2, 2, 3, 1, 1]) = [6, 5, 3, 4, 3] then ()
neuper@48815
   242
else error "([8, 7, 6, 5, 4] %-% [2, 2, 3, 1, 1]) = [6, 5, 3, 4, 3] changed";
meindl_diana@48797
   243
neuper@48817
   244
"----------- fun %|% -------------------------------";
neuper@48817
   245
"----------- fun %|% -------------------------------";
neuper@48817
   246
"----------- fun %|% -------------------------------";
neuper@48817
   247
if ([2, 3] %|% [8, 22, 15]) = true then () else error "[2, 3] %|% [8, 22, 15] = true changed";
neuper@48817
   248
if ([4] %|% [6]) = false then () else error "[4] %|% [6] = false changed";
neuper@48844
   249
if ([12] %|% [6]) = false then () else error "[12] %|% [6] = false changed";
neuper@48817
   250
if ([8] %|% [16, 0]) = true then () else error "[8] %|% [16, 0] = true changed";
neuper@48817
   251
if ([3, 2] %|% [0, 0, 9, 12, 4] ) = true then () else error "[3, 2] %|% [0,0,9..]  = true changed";
neuper@48817
   252
if ([8, 0] %|% [16]) = true then () else error "[8,0] %|% [16] = true changed";
meindl_diana@48797
   253
neuper@48855
   254
"----------- fun centr_up -----------------------------";
neuper@48855
   255
"----------- fun centr_up -----------------------------";
neuper@48855
   256
"----------- fun centr_up -----------------------------";
neuper@48855
   257
if centr_up [7, 3, 5, 8, 1, 3] 10 = [~3, 3, 5, ~2, 1, 3] then ()
neuper@48855
   258
else error "centr_up [7, 3, 5, 8, 1, 3] 10 = [~3, 3, 5, ~2, 1, 3] changed";
neuper@48855
   259
if centr_up [1, 2, 3, 4, 5] 2  = [1, 0, 1, 2, 3] then () else error "centr_up [1,.] 2 changed";
neuper@48855
   260
if centr_up [1, 2, 3, 4, 5] 3  = [1, ~1, 0, 1, 2] then () else error "centr_up [1,.] 3 changed";
neuper@48855
   261
if centr_up [1, 2, 3, 4, 5] 4  = [1, 2, ~1, 0, 1] then () else error "centr_up [1,.] 4 changed";
neuper@48855
   262
if centr_up [1, 2, 3, 4, 5] 5  = [1, 2, 3, ~1, 0] then () else error "centr_up [1,.] 5 changed";
neuper@48855
   263
if centr_up [1, 2, 3, 4, 5] 6  = [1, 2, 3, ~2, ~1] then () else error "centr_up [1,.]6 changed";
neuper@48855
   264
if centr_up [1, 2, 3, 4, 5] 7  = [1, 2, 3, 4, ~2] then () else error "centr_up [1,.] 7 changed";
neuper@48855
   265
if centr_up [1, 2, 3, 4, 5] 8  = [1, 2, 3, 4, ~3] then () else error "centr_up [1,.] 8 changed";
neuper@48855
   266
if centr_up [1, 2, 3, 4, 5] 9  = [1, 2, 3, 4, 5] then () else error "centr_up [1,.] 9 changed";
neuper@48855
   267
if centr_up [1, 2, 3, 4, 5] 10 = [1, 2, 3, 4, 5] then () else error "centr_up [1,.] 10 changed";
neuper@48855
   268
if centr_up [1, 2, 3, 4, 5] 11 = [1, 2, 3, 4, 5] then () else error "centr_up [1,.] 11 changed";
neuper@48823
   269
neuper@48823
   270
"----------- fun sum_lmb --------------------------------";
neuper@48823
   271
"----------- fun sum_lmb --------------------------------";
neuper@48823
   272
"----------- fun sum_lmb --------------------------------";
neuper@48823
   273
if sum_lmb [1, 2, 3, 4, 5] 1 = 15 then () else error "sum_lmb [1, 2, 3, 4, 5] 1 changed";
neuper@48823
   274
if sum_lmb [1, 2, 3, 4, 5] 2 = 55 then () else error "sum_lmb [1, 2, 3, 4, 5] 2 changed";
neuper@48823
   275
if sum_lmb [1, 2, 3, 4, 5] 3 = 225 then () else error "sum_lmb [1, 2, 3, 4, 5] 3 changed";
neuper@48823
   276
if sum_lmb [1, 2, 3, 4, 5] 4 = 979 then () else error "sum_lmb [1, 2, 3, 4, 5] 4 changed";
neuper@48823
   277
if sum_lmb [1, 2, 3, 4, 5] 5 = 4425 then () else error "sum_lmb [1, 2, 3, 4, 5] 5 changed";
neuper@48823
   278
if sum_lmb [1, 2, 3, 4, 5] 6 = 20515 then () else error "sum_lmb [1, 2, 3, 4, 5] 6 changed";
neuper@48823
   279
if sum_lmb [~1, 2, ~3, 4, ~5] 1 = ~3 then () else error "sum_lmb [~1, 2, ~3, 4, ~5] 1 changed";
neuper@48823
   280
if sum_lmb [~1, 2, ~3, 4, ~5] 2 = 55 then () else error "sum_lmb [~1, 2, ~3, 4, ~5] 2 changed";
neuper@48823
   281
if sum_lmb [~1, 2, ~3, 4, ~5] 3 = ~81 then () else error "sum_lmb [~1, 2, ~3, 4, ~5] 3 changed";
neuper@48823
   282
if sum_lmb [~1, 2, ~3, 4, ~5] 4 = 979 then () else error "sum_lmb [~1, 2, ~3, 4, ~5] 4 changed";
neuper@48823
   283
if sum_lmb [~1, 2, ~3, 4, ~5] 5 = ~2313 then () else error "sum_lmb [~1, 2, ~3, 4, ~5] 5 changed";
neuper@48823
   284
if sum_lmb [~1, 2, ~3, 4, ~5] 6 = 20515 then () else error "sum_lmb [~1, 2, ~3, 4, ~5] 6 changed";
neuper@48823
   285
neuper@48830
   286
"----------- fun LANDAU_MIGNOTTE_bound ------------------";
neuper@48830
   287
"----------- fun LANDAU_MIGNOTTE_bound ------------------";
neuper@48830
   288
"----------- fun LANDAU_MIGNOTTE_bound ------------------";
neuper@48830
   289
if LANDAU_MIGNOTTE_bound [1] [4, 5] = 1 then () else error "LANDAU_MIGNOTTE_bound 1";
neuper@48830
   290
if LANDAU_MIGNOTTE_bound [1, 2] [4, 5] = 2 then () else error "LANDAU_MIGNOTTE_bound 2";
neuper@48830
   291
if LANDAU_MIGNOTTE_bound [1, 2, 3] [4, 5] = 2 then () else error "LANDAU_MIGNOTTE_bound 3";
neuper@48830
   292
if LANDAU_MIGNOTTE_bound [1, 2, 3] [4] = 1 then () else error "LANDAU_MIGNOTTE_bound 4";
neuper@48830
   293
if LANDAU_MIGNOTTE_bound [1, 2, 3] [4, 5] = 2 then () else error "LANDAU_MIGNOTTE_bound 5";
neuper@48830
   294
if LANDAU_MIGNOTTE_bound [1, 2, 3] [4, 5, 6] = 12 then () else error "LANDAU_MIGNOTTE_bound 6";
neuper@48830
   295
if LANDAU_MIGNOTTE_bound [1, 2, 3] [4, 5] = LANDAU_MIGNOTTE_bound [4, 5] [1, 2, 3] then () 
neuper@48830
   296
  else error "LANDAU_MIGNOTTE_bound 7";
neuper@48830
   297
if LANDAU_MIGNOTTE_bound [~1] [4, 5] = 1 then () else error "LANDAU_MIGNOTTE_bound 11";
neuper@48830
   298
if LANDAU_MIGNOTTE_bound [~1, 2] [4, 5] = 2 then () else error "LANDAU_MIGNOTTE_bound 12";
neuper@48830
   299
if LANDAU_MIGNOTTE_bound [~1, 2, ~3] [4, ~5] = 2 then () else error "LANDAU_MIGNOTTE_bound 13";
neuper@48830
   300
if LANDAU_MIGNOTTE_bound [~1, 2, ~3] [4] = 1 then () else error "LANDAU_MIGNOTTE_bound 14";
neuper@48830
   301
if LANDAU_MIGNOTTE_bound [~1, 2, ~3] [4, ~5] = 2 then () else error "LANDAU_MIGNOTTE_bound 15";
neuper@48830
   302
if LANDAU_MIGNOTTE_bound [~1, 2, ~3] [4, ~5, 6] = 12 then () else error "LANDAU_MIGNOTTE_bound 16";
neuper@48830
   303
if LANDAU_MIGNOTTE_bound [~1, 2, ~3] [4, ~5] = LANDAU_MIGNOTTE_bound [4, 5] [1, 2, 3] then () 
neuper@48830
   304
  else error "LANDAU_MIGNOTTE_bound 17" 
meindl_diana@48797
   305
neuper@48855
   306
"----------- fun chinese_remainder_up -------------------";
neuper@48855
   307
"----------- fun chinese_remainder_up -------------------";
neuper@48855
   308
"----------- fun chinese_remainder_up -------------------";
neuper@48855
   309
if (chinese_remainder_up (5, 7) ([2, 2, 4, 3], [3, 2, 3, 5])) = [17, 2, 24, 33] then ()
neuper@48855
   310
else error "chinese_remainder_up (5, 7)... changed";
neuper@48815
   311
neuper@48857
   312
"----------- fun mod_up ---------------------------------";
neuper@48857
   313
"----------- fun mod_up ---------------------------------";
neuper@48857
   314
"----------- fun mod_up ---------------------------------";
neuper@48857
   315
if ([5, 4, 7, 8, 1] mod_up 5) = [0, 4, 2, 3, 1] then () 
neuper@48857
   316
else error "[5, 4, 7, 8, 1] mod_up 5 = [0, 4, 2, 3, 1] changed" ;
neuper@48857
   317
if ([5, 4, ~7, 8, ~1] mod_up 5) = [0, 4, 3, 3, 4] then () 
neuper@48857
   318
else error "[5, 4, ~7, 8, ~1] mod_up 5  = [0, 4, 3, 3, 4] changed" ;
neuper@48815
   319
neuper@48857
   320
"----------- fun mod_up_gcd -----------------------------";
neuper@48857
   321
"----------- fun mod_up_gcd -----------------------------";
neuper@48857
   322
"----------- fun mod_up_gcd -----------------------------";
neuper@48857
   323
if mod_up_gcd [~18, ~15, ~20, 12, 20, ~13, 2] [8, 28, 22, ~11, ~14, 1, 2] 7 =
meindl_diana@48819
   324
  [2, 6, 0, 2, 6] then () 
neuper@48857
   325
else error "( mod_up_gcd [~18, ~15, ~20, ...] [8, 28, 22, ...] 7 = [5, 1, 0, ..] changed";
neuper@48857
   326
if mod_up_gcd [8, 28, 22, ~11, ~14, 1, 2] [2, 6, 0, 2, 6] 7 = [2, 6, 0, 2, 6] then ()
neuper@48857
   327
else error "mod_up_gcd [8, 28, 22, ...] [2, 6, 0, ...] 7 = [1, 3, 0, 1, 3] changed";
neuper@48857
   328
if mod_up_gcd [20, 15, 8, 6] [8, ~2, ~2, 3] 2 = [0, 1] then ()
neuper@48857
   329
else error " mod_up_gcd [20, 15, 8, 6] [8, ~2, ~2, 3] 2 = [0, 1] changed";
meindl_diana@48797
   330
neuper@48857
   331
"~~~~~ fun mod_up_gcd , args:"; 
meindl_diana@48797
   332
val (a,b,m) = ([ ~13, 2,12],[ ~14, 2],5);
neuper@48857
   333
val moda = a mod_up m;
neuper@48857
   334
val modb = (replicate (length a - length(drop_lc0_up b)) 0) @ (drop_lc0_up b mod_up m) ;
neuper@48846
   335
val c =  mod_div (lcoeff_up moda) (lcoeff_up modb) m;
neuper@48857
   336
val rest = drop_lc0_up (moda %-% (modb %* c) mod_up m) mod_up m;
meindl_diana@48797
   337
rest = []; (*=false*)
meindl_diana@48797
   338
length rest < length b; (*=false*)
neuper@48857
   339
"~~~~~ fun  mod_up_gcd , args:";
meindl_diana@48819
   340
val (a,b,m) = (rest, b , m );
neuper@48857
   341
val moda = a mod_up m
neuper@48857
   342
val modb = (replicate (length a - length(drop_lc0_up b)) 0) @ (drop_lc0_up b mod_up m) ;
neuper@48846
   343
val c =  mod_div (lcoeff_up moda) (lcoeff_up modb) m
neuper@48857
   344
val rest = drop_lc0_up ((moda %-% (modb %*  c)) mod_up m);
meindl_diana@48797
   345
rest = [];(*=flase*)
meindl_diana@48797
   346
length rest < length b; (*=true*)
neuper@48857
   347
"~~~~~ fun  mod_up_gcd , args:";
meindl_diana@48819
   348
val (a,b,m) = (b, rest, m);
neuper@48857
   349
val moda = a mod_up m
neuper@48857
   350
val modb = (replicate (length a - length(drop_lc0_up b)) 0) @ (drop_lc0_up b mod_up m) ;
neuper@48846
   351
val c =  mod_div (lcoeff_up moda) (lcoeff_up modb) m
neuper@48857
   352
val rest = drop_lc0_up ((moda %-% (modb %*  c)) mod_up m);
meindl_diana@48797
   353
rest = [];(*=flase*)
meindl_diana@48797
   354
length rest < length b; (*=false*)
neuper@48857
   355
"~~~~~ fun  mod_up_gcd , args:";
meindl_diana@48819
   356
val (a,b,m) = (rest,b, m);
neuper@48857
   357
val moda = a mod_up m
neuper@48857
   358
val modb = (replicate (length a - length(drop_lc0_up b)) 0) @ (drop_lc0_up b mod_up m) ;
neuper@48846
   359
val c =  mod_div (lcoeff_up moda) (lcoeff_up modb) m
neuper@48857
   360
val rest = drop_lc0_up ((moda %-% (modb %*  c)) mod_up m);
meindl_diana@48797
   361
rest = [];(*=true*)
meindl_diana@48819
   362
"~~~~~ to  return val:"; val b = b;
meindl_diana@48797
   363
neuper@48855
   364
"----------- fun primitive_up ---------------------------";
neuper@48855
   365
"----------- fun primitive_up ---------------------------";
neuper@48855
   366
"----------- fun primitive_up ---------------------------";
neuper@48855
   367
if primitive_up [12, 16, 32, 44] = [3, 4, 8, 11] then () 
neuper@48855
   368
  else error "primitive_up [12, 16, 32, 44] = [3, 4, 8, 11] changed";
neuper@48855
   369
if primitive_up [4, 5, 12] =  [4, 5, 12] then () else error "primitive_up [4, 5, 12] =[4, 5, 12] changed";
neuper@48855
   370
if primitive_up [0] = [0] then () else error "primitive_up [0] = [0] changed";
neuper@48855
   371
if primitive_up [6] = [1] then () else error "primitive_up [6] = [1] changed";
meindl_diana@48797
   372
neuper@48855
   373
"----------- fun try_new_prime_up -----------------------";
neuper@48855
   374
"----------- fun try_new_prime_up -----------------------";
neuper@48855
   375
"----------- fun try_new_prime_up -----------------------";
neuper@48855
   376
"~~~~~ fun gcd_up, args:"; val (a, b) = ([~18, ~15, ~20, 12, 20, ~13, 2], 
neuper@48855
   377
                                              [8, 28, 22, ~11, ~14, 1, 2]);
neuper@48855
   378
"~~~~~ fun HENSEL_lifting_up, args:"; val (a, b, d, M, p) = 
neuper@48855
   379
  (a, b, (abs (Integer.gcd (lcoeff_up a) (lcoeff_up b))),  
neuper@48855
   380
    (2 * (abs (Integer.gcd (lcoeff_up a) (lcoeff_up b))) * LANDAU_MIGNOTTE_bound a b), 1);
neuper@48855
   381
      val p = p next_prime_not_dvd d 
neuper@48855
   382
neuper@48855
   383
      val p = p next_prime_not_dvd d 
neuper@48857
   384
      val g_p = centr_up (((normalise (mod_up_gcd a b p) p) %* (d mod p)) mod_up p) p;
neuper@48855
   385
deg_up g_p = 0 (* = false*);
neuper@48855
   386
          (*val g = primitive_up (try_new_prime_up a b d M p g_p p)*)
neuper@48855
   387
"~~~~~ fun try_new_prime_up, args:"; val (a, b, d, M, P, g, p) = (a, b, d, M, p, g_p, p);
neuper@48855
   388
P > M (* = false*);
neuper@48855
   389
        val p' = p next_prime_not_dvd d;
neuper@48857
   390
        val g_p = centr_up ((            (normalise (mod_up_gcd a b p') p') 
neuper@48855
   391
                                        %* (d mod p'))                  
neuper@48857
   392
                               mod_up p') 
neuper@48855
   393
                             p'
neuper@48855
   394
;
neuper@48871
   395
val (a, b, d, M, P, g, p) = (0, 0, 0, 0, 0, 0, 0) (*isolate test below*)
neuper@48871
   396
neuper@48871
   397
val (a, b) = ([~18, ~15, ~20, 12, 20, ~13, 2], [8, 28, 22, ~11, ~14, 1, 2])
neuper@48871
   398
val d = abs (Integer.gcd (lcoeff_up a) (lcoeff_up b))
neuper@48871
   399
val M = 2 * d * LANDAU_MIGNOTTE_bound a b
neuper@48871
   400
val p = 1 (*-> p in head of HENSEL_lifting_up*) next_prime_not_dvd d
neuper@48871
   401
val g_p = centr_up (((normalise (mod_up_gcd a b p) p) %* (d mod p)) mod_up p) p (*see above*)
neuper@48871
   402
val (a, b, d, M, P, g, p) = (a, b, d, M, p, g_p, p);
neuper@48871
   403
neuper@48871
   404
if try_new_prime_up a b d M P g p = [~1, 1, ~1] then () else error "try_new_prime_up changed";
neuper@48855
   405
neuper@52065
   406
(* ---- output from changeset cf55b1438731
neuper@48871
   407
try_new_prime_up: a = [~18, ~15, ~20, 12, 20, ~13, 2], b = [8, 28, 22, ~11, ~14, 1, 2], 
neuper@48871
   408
d = 2, M = 10240, P = 12597, g = [~1, 1, ~1], p = 19 
neuper@48871
   409
try_new_prime_up 1 -----> [~1, 1, ~1] *)
neuper@48871
   410
val (a, b, d, M, P, g, p) = 
neuper@48871
   411
  ([~18, ~15, ~20, 12, 20, ~13, 2], [8, 28, 22, ~11, ~14, 1, 2],
neuper@48871
   412
    2, 10240, 3, [~1, 1, ~1], 3);
neuper@48871
   413
"-----";
neuper@48871
   414
if try_new_prime_up a b d M P g p = [~1, 1, ~1] 
neuper@48876
   415
  then () else error "try_new_prime_up I [~18, ~15, ... changed";
neuper@48871
   416
neuper@52065
   417
(* ---- output from changeset cf55b1438731
neuper@48871
   418
try_new_prime_up: a = [~18, ~15, ~20, 12, 20, ~13, 2], b = [8, 28, 22, ~11, ~14, 1, 2], 
neuper@48871
   419
d = 2, M = 10240, P = 96577, g = [~4, ~2, 2], p = 23 
neuper@48871
   420
try_new_prime_up 1 -----> [~4, ~2, 2] *)
neuper@48871
   421
val (a, b, d, M, P, g, p) = 
neuper@48871
   422
  ([~18, ~15, ~20, 12, 20, ~13, 2], [8, 28, 22, ~11, ~14, 1, 2],
neuper@48871
   423
    2, 10240, 5, [2, 2, 2, 2], 5);
neuper@48871
   424
if try_new_prime_up a b d M P g p = [~4, ~2, 2]
neuper@48876
   425
  then () else error "try_new_prime_up II [~18, ~15, ... changed";
neuper@48876
   426
neuper@48876
   427
(* output for "gcd_up [~1, 0 ,1] [0, 1, 1] = [1, 1]" from changeset cf55b1438731
neuper@48876
   428
try_new_prime_up:  a = [~1, 0, 1], b = [0, 1, 1], d = 1, M = 16, P = 2, g = [1, 1], p = 2 
neuper@48876
   429
try_new_prime_up:  a = [~1, 0, 1], b = [0, 1, 1], d = 1, M = 16, P = 6, g = [1, 1], p = 3 
neuper@48876
   430
try_new_prime_up:  a = [~1, 0, 1], b = [0, 1, 1], d = 1, M = 16, P = 30, g = [1, 1], p = 5 
neuper@48876
   431
try_new_prime_up 1 -----> [1, 1]*)
neuper@48876
   432
val (a, b, d, M, P, g, p) = ([~1, 0, 1], [0, 1, 1], 1, 16, 2, [1, 1], 2);
neuper@48876
   433
if try_new_prime_up a b d M P g p = [1, 1]
neuper@48876
   434
  then () else error "try_new_prime_up [~1, 0, ... changed";
neuper@48876
   435
neuper@48876
   436
"----------- fun gcd_up ---------------------------------";
neuper@48876
   437
"----------- fun gcd_up ---------------------------------";
neuper@48876
   438
"----------- fun gcd_up ---------------------------------";
neuper@48876
   439
if gcd_up [~18, ~15, ~20, 12, 20, ~13, 2] [8, 28, 22, ~11, ~14, 1, 2] = [~2, ~1, 1]
neuper@48876
   440
  then () else error "gcd_up [~1, 0 ... changed";
neuper@48876
   441
if gcd_up [~1, 0 ,1] [0, 1, 1] = [1, 1] 
neuper@48876
   442
  then () else error "gcd_up [~1, 0 ... changed";
meindl_diana@48797
   443
neuper@48813
   444
"=========== Multivariate Case ==========================";
neuper@48813
   445
"=========== Multivariate Case ==========================";
neuper@48813
   446
"=========== Multivariate Case ==========================";
meindl_diana@48797
   447
neuper@48853
   448
"----------- fun lcoeff ---------------------------------";
neuper@48853
   449
"----------- fun lcoeff ---------------------------------";
neuper@48853
   450
"----------- fun lcoeff ---------------------------------";
neuper@48848
   451
if lcoeff [(1,[1,1]),(2,[1,2]),(3,[1,3]),(4,[1,4]),(5,[1,5])] = 5 then () else 
neuper@48848
   452
error "lcoeff [(1,[1,1]),(2,[1,2]),(3,[1,3]),(4,[1,4]),(5,[1,5])] = 5 changed";
meindl_diana@48797
   453
neuper@48853
   454
"----------- fun lexp -----------------------------------";
neuper@48853
   455
"----------- fun lexp -----------------------------------";
neuper@48853
   456
"----------- fun lexp -----------------------------------";
neuper@48850
   457
if lexp [(1,[1,1]),(2,[1,2]),(3,[1,3]),(4,[1,4]),(5,[1,5])] = [1,5] then () else 
neuper@48848
   458
error "get_coeff [(1,[1,1]),(2,[1,2]),(3,[1,3]),(4,[1,4]),(5,[1,5])] = [1,5] changed";
meindl_diana@48797
   459
neuper@48853
   460
"----------- fun add_variable ---------------------------";
neuper@48853
   461
"----------- fun add_variable ---------------------------";
neuper@48853
   462
"----------- fun add_variable ---------------------------";
neuper@48870
   463
if add_variable 0
neuper@48870
   464
 [(1,[1,2]),(2,[2,3])] = [(1, [0, 1, 2]), (2, [0, 2, 3])] then () else 
neuper@48846
   465
error "add_variable [(1,[1,2]),(2,[2,3])] 0 = [(1, [0, 1, 2]), (2, [0, 2, 3])] changed";
neuper@48870
   466
if add_variable 1
neuper@48870
   467
 [(1,[1,2]),(2,[2,3])] = [(1, [1, 0,  2]), (2, [2, 0, 3])] then () else 
neuper@48846
   468
error "add_variable [(1,[1,2]),(2,[2,3])] 1 = [(1, [1, 0,  2]), (2, [2, 0, 3]) changed";
neuper@48870
   469
if add_variable 2
neuper@48870
   470
 [(1,[1,2]),(2,[2,3])] = [(1, [1, 2, 0]), (2, [2, 3, 0])] then () else 
neuper@48846
   471
error "add_variable [(1,[1,2]),(2,[2,3])] 2 = [(1, [1, 2, 0]), (2, [2, 3, 0])] changed";
meindl_diana@48797
   472
neuper@48870
   473
"----------- fun zero_poly ------------------------------";
neuper@48870
   474
"----------- fun zero_poly ------------------------------";
neuper@48870
   475
"----------- fun zero_poly ------------------------------";
neuper@48870
   476
if zero_poly 1 = [(0, [0])] then () else 
neuper@48870
   477
error "zero_poly 1 = [(0, [0])] changed";
neuper@48870
   478
if zero_poly 5 = [(0, [0, 0, 0, 0, 0])] then () else 
neuper@48870
   479
error "zero_poly 1 = [(0, [0, 0, 0, 0, 0])] changed";
meindl_diana@48797
   480
neuper@48853
   481
"----------- drop_lc0 -----------------------------------";
neuper@48853
   482
"----------- drop_lc0 -----------------------------------";
neuper@48853
   483
"----------- drop_lc0 -----------------------------------";
neuper@48846
   484
if drop_lc0 [(4,[2]),(3,[3])] = [(4,[2]),(3,[3])] then () 
neuper@48846
   485
else error "drop_lc0 [(4,[2]),(3,[3])] = [(4,[2]),(3,[3])] changed";
neuper@48846
   486
if drop_lc0 [(4,[2]),(0,[3])] = [(4,[2])] then () 
neuper@48846
   487
else error "drop_lc0 [(4,[2]),(3,[3])] = [(4,[2])] changed";
neuper@48846
   488
if drop_lc0 [(0,[2]),(3,[3])] = [(0,[2]),(3,[3])] then () 
neuper@48846
   489
else error "drop_lc0 [(0,[2]),(3,[3])] = [(0,[2]),(3,[3])] changed";
neuper@48846
   490
if drop_lc0 [(0,[2]),(0,[3])] = [(0,[0])] then () 
neuper@48846
   491
else error "drop_lc0  [(0,[2]),(0,[3])] = [(0,[0])] changed";
meindl_diana@48824
   492
neuper@48853
   493
"----------- fun add_monoms -----------------------------";
neuper@48853
   494
"----------- fun add_monoms -----------------------------";
neuper@48853
   495
"----------- fun add_monoms -----------------------------";
neuper@48847
   496
if add_monoms [(~3,[0,0]),(4,[0,0]),(3,[1,1]),(~3,[1,1]),(2,[1,2]),(~3,[1,2])] = 
neuper@48846
   497
  [(1, [0, 0]), (~1, [1, 2])] 
neuper@48847
   498
then () else error ("add_monoms [(~3,[0,0]),(4,[0,0]),(3,[1,1]),(~3,[1,1]),(2,[1,2]),(~3,[1,2])] " ^
neuper@48846
   499
  "= [(1, [0, 0]), (~1, [1, 2])] changed")
meindl_diana@48797
   500
neuper@48853
   501
"----------- fun lex_ord --------------------------------";
neuper@48853
   502
"----------- fun lex_ord --------------------------------";
neuper@48853
   503
"----------- fun lex_ord --------------------------------";
neuper@48850
   504
if lex_ord (000, [3]) (000, [4])
neuper@48850
   505
then error " lex_ord (000, [3]) (000, [4]) changed = false"  else ();
neuper@48850
   506
if lex_ord (000, [1,2]) (000, [0,3])
neuper@48849
   507
then error " lex_ord [1,2] [0,3] changed = false"  else ();
neuper@48850
   508
if lex_ord  (000, [1,2]) (000, [3,0])
neuper@48849
   509
then ()  else error " lex_ord  [1,2] [3,0] = true changed";
neuper@48850
   510
if lex_ord (000, [1,2]) (000, [1,2])
neuper@48849
   511
then error " lex_ord [1,2] [1,2] changed = false"  else ();
meindl_diana@48797
   512
neuper@48853
   513
"----------- fun order ----------------------------------";
neuper@48853
   514
"----------- fun order ----------------------------------";
neuper@48853
   515
"----------- fun order ----------------------------------";
neuper@48851
   516
if order [(3,[1,1]),(2,[1,2]),(~3,[0,0]),(~3,[1,1]),(~3,[1,2]),(4,[0,0])] = 
neuper@48847
   517
  [(1, [0, 0]), (~1, [1, 2])] 
neuper@48851
   518
then () else error ("order [(3,[1,1]),(2,[1,2]),(~3,[0,0]),(~3,[1,1]),(~3,[1,2]),(4,[0,0])]" ^
neuper@48847
   519
  " = [(1, [0, 0]), (~1, [1, 2])] changed")
meindl_diana@48797
   520
neuper@48846
   521
(*"----------- fun lcoeff ---------------------------";
neuper@48846
   522
"----------- fun lcoeff ---------------------------";
neuper@48846
   523
"----------- fun lcoeff ---------------------------";
neuper@48846
   524
if lcoeff [(~3,[0,0]),(4,[0,0]),(3,[1,1]),(~3,[1,1]),(2,[1,2]),(~3,[1,2])] = ~1 
neuper@48846
   525
then () else error "lcoeff [(~3,[0,0]),(4,[0,0]),(3,[1,1]),(~3,[1,1]),(2,[1,2]),(~3,[1,2])] = ~1  changed";
neuper@48846
   526
if lcoeff [(3,[1,1]),(2,[1,2]),(~3,[0,0])] = 2 
neuper@48846
   527
then () else error "lcoeff [(3,[1,1]),(2,[1,2]),(~3,[0,0])] = 2   changed";*)
meindl_diana@48797
   528
neuper@48853
   529
"----------- fun lexp -----------------------------------";
neuper@48853
   530
"----------- fun lexp -----------------------------------";
neuper@48853
   531
"----------- fun lexp -----------------------------------";
neuper@48850
   532
if lexp [(~3,[0,0]),(4,[0,0]),(3,[1,1]),(~3,[1,1]),(2,[1,2])] = [1,2]
neuper@48850
   533
then () else error "lexp [(~3,[0,0]),(4,[0,0]),(3,[1,1]),(~3,[1,1]),(2,[1,2])] = ~1  changed";
meindl_diana@48797
   534
meindl_diana@48797
   535
"----------- fun max_deg_var ----------------------------";
meindl_diana@48797
   536
"----------- fun max_deg_var ----------------------------";
meindl_diana@48797
   537
"----------- fun max_deg_var ----------------------------";
meindl_diana@48797
   538
if max_deg_var [(1,[1,2]),(2,[2,3]),(3,[5,4]),(1,[0,0])] 0 = 5 then ()
meindl_diana@48797
   539
else error " max_deg_var [(1,[1,2]),(2,[2,3]),(3,[5,4]),(1,[0,0])] 0 = 5 changed";
meindl_diana@48797
   540
if max_deg_var [(1,[1,2]),(2,[2,3]),(3,[5,4]),(1,[0,0])] 1 = 4 then ()
meindl_diana@48797
   541
else error " max_deg_var [(1,[1,2]),(2,[2,3]),(3,[5,4]),(1,[0,0])] 1 = 4 changed";
meindl_diana@48797
   542
meindl_diana@48797
   543
"----------- infix %%/ ----------------------------------";
meindl_diana@48797
   544
"----------- infix %%/ ----------------------------------";
meindl_diana@48797
   545
"----------- infix %%/ ----------------------------------";
neuper@48850
   546
if ([(~3, [2, 0]), (~6, [1, 1]), (~1, [3, 1]),(1, [5, 0]), (2, [4, 1])] %%/ 2) = 
neuper@48850
   547
    [(~1, [2, 0]), (~3, [1, 1]), (1, [4, 1])] then ()
neuper@48850
   548
else error ("[(~3, [2, 0]), (~6, [1, 1]), (~1, [3, 1]),(1, [5, 0]), (2, [4, 1])] %%/ 2  =  " ^
neuper@48850
   549
  "[(~1, [2, 0]), (~3, [1, 1]), (1, [4, 1])] changed");
meindl_diana@48797
   550
neuper@48853
   551
"----------- infix %%*%% --------------------------------";
neuper@48853
   552
"----------- infix %%*%% --------------------------------";
neuper@48853
   553
"----------- infix %%*%% --------------------------------";
neuper@48853
   554
val p1 = [(1,[1,0]), (1,[0,1])];     (* a   + b   *)
neuper@48853
   555
val p2 = [(1,[1,0]), (~1,[0,1])];    (* a   - b   *)
neuper@48853
   556
val p = [(1, [2, 0]), (~1, [0, 2])]; (* a^2 - b^2 *)
neuper@48853
   557
if (p1 %%*%% p2) = p then () else error "%%*%% changed";
neuper@48853
   558
neuper@48853
   559
val p1 = order [(1,[1,2,3]), (2,[2,2,2]), (3,[3,2,1])]: poly;
neuper@48853
   560
val p2 = order [(10,[1,2,3]), (20,[1,1,1]), (30,[3,2,1])]: poly;
neuper@48853
   561
if (p1 %%*%% p2) = 
neuper@48853
   562
  [(60, [4, 3, 2]), (90, [6, 4, 2]), (40, [3, 3, 3]), (60, [5, 4, 3]), 
neuper@48853
   563
   (20, [2, 3, 4]), (60, [4, 4, 4]), (20, [3, 4, 5]), (10, [2, 4, 6])] then ()
neuper@48853
   564
else error "%%*%% changed"
neuper@48853
   565
neuper@48853
   566
"----------- fun gcd_coeff ------------------------------";
neuper@48853
   567
"----------- fun gcd_coeff ------------------------------";
neuper@48853
   568
"----------- fun gcd_coeff ------------------------------";
neuper@48850
   569
if gcd_coeff [4,8,12,~2,0,~4] = 2 then () else error " gcd_coeff [4,8,12,~2,0,~4] = 2 changed";
neuper@48850
   570
if gcd_coeff [3,6,9,19] = 1 then () else error " gcd_coeff [3,6,9,19] = 1 changed";
meindl_diana@48797
   571
neuper@48850
   572
(*"----------- fun gcd_coeff_poly -------------------------";
neuper@48850
   573
"----------- fun gcd_coeff_poly -------------------------";
neuper@48850
   574
"----------- fun gcd_coeff_poly -------------------------";
neuper@48850
   575
if gcd_coeff_poly [(3,[1,2,3,1])] = 3 then () else error " gcd_coeff_poly [(3,[1,2,3,1])] = 3 changed";
neuper@48850
   576
if gcd_coeff_poly [(~2, [2, 0]), (4, [5, 0]),(~4, [3, 2]), (2, [2, 3])] = 2 then () 
neuper@48850
   577
else error "gcd_coeff_poly [(~2, [2, 0]), (4, [5, 0]),(~4, [3, 2]), (2, [2, 3])] = 2 changed";
neuper@48850
   578
if gcd_coeff_poly [(~2, [2, 0]), (5, [5, 0]),(~4, [3, 2]), (2, [2, 3])] = 1 then ()
neuper@48850
   579
else error "gcd_coeff_poly [(~2, [2, 0]), (5, [5, 0]),(~4, [3, 2]), (2, [2, 3])] = 1 changed";*)
meindl_diana@48797
   580
neuper@48854
   581
"----------- fun eval -----------------------------------";
neuper@48854
   582
"----------- fun eval -----------------------------------";
neuper@48854
   583
"----------- fun eval -----------------------------------";
neuper@48854
   584
if eval [(~3, [2, 1]), (2, [0, 1]), (1,[2, 0])] 0 1 = [(1, [0]), (~1, [1])] then () 
neuper@48854
   585
  else error " eval [(~3, [2, 1]), (2, [0, 1]),(1,[2,0])] 0 1 = [(1, [0]), (~1, [1])] changed";
neuper@48854
   586
if eval [(~3, [2, 1]), (2, [0, 1]), (1,[2, 0])] 1 1 = [(2, [0]), (~2, [2])] then () 
neuper@48854
   587
  else error " eval [(~3, [2, 1]), (2, [0, 1]),(1,[2,0])] 1 1 =[(2, [0]), (~2, [2])] changed";
neuper@48854
   588
if eval [(~3, [2, 1]), (2, [0, 1]), (1,[2, 0])] 0 3 = [(9, [0]), (~25, [1])] then () 
neuper@48854
   589
  else error " eval [(~3, [2, 1]), (2, [0, 1]),(1,[2,0])] 0 3 = [(9, [0]), (~25, [1])] changed";
neuper@48854
   590
if eval [(~3, [2, 1]), (2, [0, 1]), (1,[2, 0])] 1 3 = [(6, [0]), (~8, [2])] then () 
neuper@48854
   591
  else error " eval [(~3, [2, 1]), (2, [0, 1]),(1,[2,0])] 1 3 = [ (6, [0]), (~8, [2])] changed";
meindl_diana@48797
   592
neuper@48850
   593
"----------- fun multi_to_uni ---------------------------";
neuper@48850
   594
"----------- fun multi_to_uni ---------------------------";
neuper@48850
   595
"----------- fun multi_to_uni ---------------------------";
meindl_diana@48797
   596
if multi_to_uni [(~3, [1]), (2, [1]), (1, [0])] = [1, ~1]
meindl_diana@48797
   597
then () else error " multi_to_uni [(~3, [1]), (2, [1]), (1, [0])] = [1, ~1] changed";
meindl_diana@48797
   598
neuper@48850
   599
"----------- fun uni_to_multi ---------------------------";
neuper@48850
   600
"----------- fun uni_to_multi ---------------------------";
neuper@48850
   601
"----------- fun uni_to_multi ---------------------------";
neuper@48850
   602
if uni_to_multi [~11, 11, 22, 33, 44, 55] = 
neuper@48850
   603
  [(~11, [0]), (11, [1]), (22, [2]), (33, [3]), (44, [4]), (55, [5])] then ()
neuper@48854
   604
else error "uni_to_multi changed";
neuper@48850
   605
neuper@48853
   606
if uni_to_multi [1,2,1,1,3,4] = [(1, [0]), (2, [1]), (1, [2]), (1, [3]), (3, [4]), (4, [5])] then ()
neuper@48853
   607
else error "uni_to_multi [1,2,1,1,3,4] = [(1, [0]), (2, [1]), (1, [2]), (1, [3]), (3, [4]), (4, [5])] changed";
neuper@48853
   608
if uni_to_multi [1,2,0,0,5,6] = [(1, [0]), (2, [1]), (5, [4]), (6, [5])] then ()
neuper@48853
   609
else error "uni_to_multi [1,2,0,0,5,6] = [(1, [0]), (2, [1]), (5, [4]), (6, [5])] changed";
neuper@48853
   610
neuper@48853
   611
meindl_diana@48797
   612
"----------- fun find_new_r  ----------------------------";
meindl_diana@48797
   613
"----------- fun find_new_r  ----------------------------";
meindl_diana@48797
   614
"----------- fun find_new_r  ----------------------------";
meindl_diana@48797
   615
if find_new_r [(2,[0,0]),(1,[1,2])] [(4,[2,2]),(1,[1,2])] ~1 = 1 then ()
meindl_diana@48797
   616
else error " find_new_r [(2,[0,0]),(1,[1,2])] [(4,[2,2]),(1,[1,2])] ~1 = 1 changed";
meindl_diana@48797
   617
if find_new_r [(2,[0,0]),(1,[1,2])] [(4,[2,2]),(1,[1,2])] 1 = 2 then ()
meindl_diana@48797
   618
else error "find_new_r [(2,[0,0]),(1,[1,2])] [(4,[2,2]),(1,[1,2])] 1 = 2 changed";
meindl_diana@48797
   619
if find_new_r [(2,[1,2]),(~4,[0,2]),(2,[1,1])] [(1,[1,3]),(~2,[0,3])] 1 = 3 then ()
meindl_diana@48797
   620
else error "find_new_r [(2,[1,2]),(~4,[0,2]),(2,[1,1])] [(1,[1,3]),(~2,[0,3])] 1 = 3 changed";
meindl_diana@48797
   621
meindl_diana@48797
   622
"----------- fun mult_with_new_var  ---------------------";
meindl_diana@48797
   623
"----------- fun mult_with_new_var  ---------------------";
meindl_diana@48797
   624
"----------- fun mult_with_new_var  ---------------------";
meindl_diana@48797
   625
if mult_with_new_var [(3,[0]),(2,[1])] [~1,1] 0 = [(~3, [0, 0]), (3, [1, 0]), (~2, [0, 1]), (2, [1, 1])] then ()
meindl_diana@48797
   626
else error "mult_with_new_var [(3,[0]),(2,[1])] [~1,1] 0 = [(~3, [0, 0]), (3, [1, 0]), (~2, [0, 1]), (2, [1, 1])] changed";
meindl_diana@48797
   627
neuper@48846
   628
(*"----------- fun greater_deg  -----------------";
neuper@48853
   629
"----------- fun greater_deg  -----------------";475
neuper@48846
   630
"----------- fun greater_deg  -----------------";
neuper@48846
   631
greater_deg [1,2,3] [1,2,4] =2;*)
meindl_diana@48797
   632
meindl_diana@48797
   633
"----------- infix %%+%%  -------------------------------";
meindl_diana@48797
   634
"----------- infix %%+%%  -------------------------------";
meindl_diana@48797
   635
"----------- infix %%+%%  -------------------------------";
meindl_diana@48797
   636
if ([(3,[0,0]),(2,[3,2]),(~3,[1,3])] %%+%% [(3,[3,2]),(~1,[0,0]),(2,[1,1])]) = [(2, [0, 0]), (2, [1, 1]), (5, [3, 2]), (~3, [1, 3])]
meindl_diana@48797
   637
then () else error "([(3,[0,0]),(2,[3,2]),(~3,[1,3])] %%+%% [(3,[3,2]),(~1,[0,0]),(2,[1,1])]) = [(2, [0, 0]), (2, [1, 1]), (5, [3, 2]), (~3, [1, 3])] changed";
meindl_diana@48797
   638
meindl_diana@48797
   639
"----------- infix %%-%%  -------------------------------";
meindl_diana@48797
   640
"----------- infix %%-%%  -------------------------------";
meindl_diana@48797
   641
"----------- infix %%-%%  -------------------------------";
meindl_diana@48797
   642
if ([(2, [0, 0]), (2, [1, 1]), (5, [3, 2]), (~3, [1, 3])] %%-%% [(3,[3,2]),(~1,[0,0]),(2,[1,1])]) = [(3, [0, 0]), (2, [3, 2]), (~3, [1, 3])]
meindl_diana@48797
   643
then () else error "([(2, [0, 0]), (2, [1, 1]), (5, [3, 2]), (~3, [1, 3])] %%-%% [(3,[3,2]),(~1,[0,0]),(2,[1,1])]) = [(3, [0, 0]), (2, [3, 2]), (~3, [1, 3])] changed";
meindl_diana@48797
   644
meindl_diana@48797
   645
"----------- infix %%*%%  -------------------------------";
meindl_diana@48797
   646
"----------- infix %%*%%  -------------------------------";
meindl_diana@48797
   647
"----------- infix %%*%%  -------------------------------";
meindl_diana@48797
   648
if ([(~1,[0]),(1,[1])] %%*%% [(~2,[0]),(1,[1])]) = [(2, [0]), (~3, [1]), (1, [2])]
meindl_diana@48797
   649
then () else error "([(~1,[0]),(1,[1])] %%*%% [(~2,[0]),(1,[1])]) = [(2, [0]), (~3, [1]), (1, [2])] changed";
meindl_diana@48797
   650
if ([(~2,[0]),(1,[1])] %%*%% [(1,[1]),(2,[0])]) = [(~4, [0]), (1, [2])] then ()
meindl_diana@48797
   651
else error "([(~2,[0]),(1,[1])] %%*%% [(1,[1]),(2,[0])]) = [(~4, [0]), (1, [2])] changed";
meindl_diana@48797
   652
if ([(3,[0,0]),(2,[0,1])] %%*%% [(1,[1,0]),(~1,[0,0])]) = mult_with_new_var [(3,[0]),(2,[1])] [~1,1] 0
meindl_diana@48797
   653
then () else error 
meindl_diana@48797
   654
"([(3,[0,0]),(2,[0,1])] %%*%% [(1,[1,0]),(~1,[0,0])]) = mult_with_new_var [(3,[0]),(2,[1])] [~1,1] 0 changed";
meindl_diana@48797
   655
neuper@48851
   656
"----------- infix %%/%%  -------------------------------";
neuper@48851
   657
"----------- infix %%/%%  -------------------------------";
neuper@48851
   658
"----------- infix %%/%%  -------------------------------";
neuper@48851
   659
val a = [(1,[2, 0]), (1,[1, 1]), (~1,[0, 2])]; (* (x^2 + x - y) / (x - y) = *)
neuper@48851
   660
val b = [(~1, [1, 0]), (1, [0, 1])];
neuper@48851
   661
val (c, r) = (a %%/%% b);
neuper@48851
   662
if (c, r) = ([(~1, [0, 1])], [(1, [2, 0])]) then () else error "%%/%% changed";
neuper@48851
   663
if ((c %%*%% b) %%+%% r) = a then () else error "%%/%% changed";
neuper@48851
   664
meindl_diana@48797
   665
"----------- fun newton_first  --------------------------";
meindl_diana@48797
   666
"----------- fun newton_first  --------------------------";
meindl_diana@48797
   667
"----------- fun newton_first  --------------------------";
meindl_diana@48797
   668
if newton_first [1, 2] [[(1,[1,1])], [(4,[1,1])]] 1 = 
meindl_diana@48797
   669
([(~2, [1, 0, 1]), (3, [1, 1, 1])], [~1, 1], [[(3, [1, 1])]]) 
meindl_diana@48797
   670
then () else error 
meindl_diana@48797
   671
"newton_first [1, 2] [[(1,[1,1])], [(4,[1,1])]] 1 = "
meindl_diana@48797
   672
"([(~2, [1, 0, 1]), (3, [1, 1, 1])], [~1, 1], [[(3, [1, 1])]]) changed";
meindl_diana@48797
   673
neuper@48853
   674
"----------- fun NEWTON  --------------------------------";
neuper@48853
   675
"----------- fun NEWTON  --------------------------------";
neuper@48853
   676
"----------- fun NEWTON  --------------------------------";
neuper@48870
   677
if NEWTON [1, 2 ] [[(1,[1,1])], [(4,[1,1])]] [] [1] (zero_poly 2) 1 = 
meindl_diana@48797
   678
([(~2, [1, 0, 1]), (3, [1, 1, 1])], [~1, 1], [[(3, [1, 1])]])
meindl_diana@48797
   679
then () else error
neuper@48870
   680
"NEWTON [1, 2 ] [[(1,[1,1])], [(4,[1,1])]] [] [1] (zero_poly 2) 1 = "
meindl_diana@48797
   681
"([(~2, [1, 0, 1]), (3, [1, 1, 1])], [~1, 1], [[(3, [1, 1])]]) changed";
neuper@48851
   682
if NEWTON [1, 2, 3 ] [[(4,[1,1])], [(9,[1,1])]] [[(3, [1, 1])]] [~1, 1] [(~2, [1, 0, 1]), (3, [1, 1, 1])] 1 = 
meindl_diana@48797
   683
([(1, [1, 2, 1])], [2, ~3, 1], [[(5, [1, 1])], [(1, [1, 1])]])
meindl_diana@48797
   684
then () else error
neuper@48851
   685
"NEWTON [1, 2, 3 ] [[(4,[1,1])], [(9,[1,1])]] [[(3, [1, 1])]] [~1, 1] [(~2, [1, 0, 1]), (3, [1, 1, 1])] 1 ="
meindl_diana@48797
   686
" ([(1, [1, 2, 1])], [2, ~3, 1], [[(5, [1, 1])], [(1, [1, 1])]]) changed";
meindl_diana@48797
   687
 
meindl_diana@48797
   688
neuper@48853
   689
"~~~~~ fun NEWTON, args:"; val (x,f,steps,t,p,ord) = ([1, 2, 3, 4],[[(9, [0]), (5, [1])], [(16, [0]), (7, [1])]], [[(5, [0]), (2, [1])], [(1, [0])]], [2, ~3, 1], [(1, [2, 0]), (~1, [0, 1]), (2, [1, 1])], 0  );
meindl_diana@48797
   690
length x = 2; (* false *)
meindl_diana@48797
   691
val new_value_poly = multi_to_uni((uni_to_multi t)  %%*%% (uni_to_multi [(nth x (length x -2) )* ~1, 1]));
meindl_diana@48797
   692
val new_steps = [((nth f (length f -1)) %%/ ((nth x (length x - 1)) - (nth x (length x - 2)))) %%-%% ((nth f (length f -2)))];
meindl_diana@48797
   693
meindl_diana@48797
   694
"~~~~~ fun next_step, args:"; val (steps,new_steps, x') = (steps, new_steps, x);
meindl_diana@48797
   695
steps = []; (*false*)
meindl_diana@48797
   696
meindl_diana@48797
   697
"~~~~~ fun next_step, args:"; val (steps,new_steps, x') = (nth_drop 0 steps, new_steps @ [(((nth new_steps (length new_steps -1)) %%-%%(nth steps 0))) %%/
meindl_diana@48797
   698
                                  ((nth x' (length x' - 1)) - (nth x' (length x' - 3)))], nth_drop (length x' -2) x');steps = []; (*false*)
meindl_diana@48797
   699
meindl_diana@48797
   700
"~~~~~ fun next_step, args:"; val (steps,new_steps, x') = (nth_drop 0 steps, new_steps @ [(((nth new_steps (length new_steps -1)) %%-%%(nth steps 0))) %%/
meindl_diana@48797
   701
                                  ((nth x' (length x' - 1)) - (nth x' (length x' - 3)))], nth_drop (length x' -2) x');
meindl_diana@48797
   702
steps = []; (*true*)
meindl_diana@48797
   703
val steps = new_steps;
neuper@48853
   704
val polynom' =  p %%+%% (mult_with_new_var (nth steps (length steps -1)) new_value_poly ord);
meindl_diana@48797
   705
neuper@48853
   706
"----------- fun all_geq  -------------------------------";
neuper@48853
   707
"----------- fun all_geq  -------------------------------";
neuper@48853
   708
"----------- fun all_geq  -------------------------------";
neuper@48846
   709
if all_geq  [1,2,3,4,5] [1,2,3,4,5] = true then ()
neuper@48846
   710
else error " all_geq  [1,2,3,4,5] [1,2,3,4,5] = true changed";
neuper@48846
   711
if all_geq [1,2,3,4] [1,2,3,5] = false then () 
neuper@48846
   712
else error "all_geq [1,2,3,4] [1,2,3,5] = false changed"  ;
neuper@48846
   713
if all_geq [1,4,5,4] [0,3,4,5] = false then ()
neuper@48846
   714
else error "all_geq [1,2,3,4] [0,3,4,5] = false changed ";
meindl_diana@48797
   715
neuper@48853
   716
"----------- fun greater_deg  ---------------------------";
neuper@48853
   717
"----------- fun greater_deg  ---------------------------";
neuper@48853
   718
"----------- fun greater_deg  ---------------------------";
neuper@48846
   719
if greater_deg  [1,2,3,4,5] [1,2,3,4,5] = 0 then ()
neuper@48846
   720
else error " greater_deg  [1,2,3,4,5] [1,2,3,4,5] = 0 changed";
neuper@48846
   721
if greater_deg [1,2,3,4] [5,2,8,1] = 1 then () 
neuper@48846
   722
else error "greater_deg [1,2,3,4] [1,2,3,5] = 1 changed"  ;
neuper@48846
   723
if greater_deg [1,4,5,4] [0,3,4,5] = 2 then ()
neuper@48846
   724
else error "greater_deg [1,2,3,4] [0,3,4,5] = 2 changed ";
meindl_diana@48797
   725
neuper@52097
   726
"----------- infix %%|%% --------------------------------";
neuper@52097
   727
"----------- infix %%|%% --------------------------------";
neuper@52097
   728
"----------- infix %%|%% --------------------------------";
neuper@52097
   729
if [(1, [0, 0]), (~1, [0, 1])] %%|%% [(1, [0, 0]), (~1, [0, 1])] then ()
neuper@52097
   730
(*   1            -       y      |     1            -       y*)
meindl_diana@48797
   731
else error "[(1, [0, 0]), (~1, [0, 1])] %%|%% [(1, [0, 0]), (~1, [0, 1])] = true changed";
neuper@52097
   732
meindl_diana@48797
   733
if [(3,[1,0])] %%|%% [(9,[1,1]),(12,[2,1]),(~3,[1,2])] then ()
neuper@52097
   734
(*   3  x        |     9  x y  + 12 x^2 y  - 3 x y^2         *)
meindl_diana@48797
   735
else error "[(3,[1,0])] %%|%% [(9,[1,1]),(12,[2,1]),(~3,[1,2])] = true changed";
neuper@52097
   736
meindl_diana@48797
   737
if [(3,[2,1])] %%|%% [(9,[1,1]),(12,[2,1]),(~3,[1,2])] 
neuper@52097
   738
(*   3 x^2 y     |     9  x y  + 12 x^2 y  - 3 x y^2         *)
meindl_diana@48797
   739
then error "[(3,[2,1])] %%|%% [(9,[1,1]),(12,[2,1]),(~3,[1,2])] = false changed" else ();
meindl_diana@48797
   740
meindl_diana@48810
   741
"----------- fun gcd_poly'  ------------------------------";
meindl_diana@48810
   742
"----------- fun gcd_poly'  ------------------------------";
meindl_diana@48810
   743
"----------- fun gcd_poly'  ------------------------------";
meindl_diana@48810
   744
if gcd_poly' [(~3,[2,0]),(1,[5,0]),(3,[0,1]),(~6,[1,1]),(~1,[3,1]),(2,[4,1]),(1,[3,2]),(~1,[1,3]),(2,[2,3])]
meindl_diana@48810
   745
[(2,[2,0]),(~2,[0,1]),(4,[1,1]),(~1,[3,1]),(1,[1,2]),(~1,[2,2]),(~1,[0,3]),(2,[1,3])] 2 0 
meindl_diana@48810
   746
= [(1, [2, 0]), (~1, [0, 1]), (2, [1, 1])] then () else error 
meindl_diana@48810
   747
"gcd_poly' [(~3,[2,0]),(1,[5,0]),(3,[0,1]),(~6,[1,1]),(~1,[3,1]),(2,[4,1]),(1,[3,2]),(~1,[1,3]),(2,[2,3])]"
meindl_diana@48810
   748
"[(2,[2,0]),(~2,[0,1]),(4,[1,1]),(~1,[3,1]),(1,[1,2]),(~1,[2,2]),(~1,[0,3]),(2,[1,3])] 2 0 "
meindl_diana@48810
   749
"= [(1, [2, 0]), (~1, [0, 1]), (2, [1, 1])] changed";
meindl_diana@48810
   750
(* -xy +xy^2z+yz - 1*)(* xy +1*) (*=*) (*xy -1*)
meindl_diana@48810
   751
if gcd_poly' [(~1,[0,0,0]),(1,[0,1,1]),(1,[1,2,1]),(~1,[1,1,0])] [(1,[0,0,0]),(1,[1,1,0])] 3 0 
neuper@52099
   752
 = [(~1, [0, 0, 0]), (~1, [1, 1, 0])] then () else error
meindl_diana@48810
   753
"gcd_poly' [(~1,[0,0,0]),(1,[0,1,1]),(1,[1,2,1]),(~1,[1,1,0])] [(1,[0,0,0]),(1,[1,1,0])] 3 0 "
meindl_diana@48810
   754
"= [(1, [0, 0, 0]), (1, [1, 1, 0])] changed";
meindl_diana@48810
   755
neuper@48807
   756
"----------- fun gcd_poly  ------------------------------";
neuper@48807
   757
"----------- fun gcd_poly  ------------------------------";
neuper@48807
   758
"----------- fun gcd_poly  ------------------------------";
neuper@48813
   759
if gcd_poly 
neuper@48867
   760
  [(~3,[2,0]),(1,[5,0]),(3,[0,1]),(~6,[1,1]),(~1,[3,1]),(2,[4,1]),(1,[3,2]),(~1,[1,3]),(2,[2,3])]
neuper@48867
   761
 (* ~3 x^2  +     x^5 +  3 y     -  6 x y     - x^3 y +  2 x^4 y +  x^3 y^2  - x y^3 +  2 x^2 y^3*)
neuper@48867
   762
  [(2,[2,0]),(~2,[0,1]),(4,[1,1]),(~1,[3,1]),(1,[1,2]),(~1,[2,2]),(~1,[0,3]),(2,[1,3])]
neuper@48867
   763
 (* 2 x^2   -  2 y    +  4  x y  -   x^3 y  +    x y^2  - x^2 y^2  -   y^3  + 2 x y^3*) 
neuper@52087
   764
= (([(~3, [0, 0]), (1, [3, 0]), (1, [1, 2])], [(2, [0, 0]), (~1, [1, 1]), (1, [0, 2])]), 
neuper@52087
   765
 (*(  3          +    x^3     +      x y^2  ,,  2         -      x y    +       y^2   ),,*)
neuper@52087
   766
    [(1, [2, 0]), (~1, [0, 1]), (2, [1, 1])])
neuper@52087
   767
 (*     x^2     -          y     2   x  y*)
neuper@52087
   768
then () else error "gcd_poly ex1 changed";
neuper@48813
   769
neuper@48813
   770
if gcd_poly 
neuper@48867
   771
  [(~1,[0,0,0]),(1,[0,1,1]),(1,[1,2,1]),(~1,[1,1,0])]
neuper@48867
   772
 (* ~1         +      y z  +  x y^2 z  -     x y *)
neuper@48867
   773
  [(1,[0,0,0]),(1,[1,1,0])]
neuper@48867
   774
 (* 1         +    x y *)
neuper@48867
   775
  = (([(~1, [0,0,0]), (1, [0,1,1])], [(1, [0,0,0])]), [(1, [0,0,0]), (1, [1,1,0])]) 
neuper@48867
   776
 (*  (  ~1          +        y z   ,,  1            ),, 1          +      x y *)
neuper@48867
   777
then () else error "gcd_poly ex2 changed";
neuper@48867
   778
neuper@48867
   779
(* example from unipoly: *)
neuper@48867
   780
val a = uni_to_multi [~18, ~15, ~20, 12, 20, ~13, 2];
neuper@48867
   781
val b = uni_to_multi [8, 28, 22, ~11, ~14, 1, 2];
neuper@48867
   782
val ((a', b'), c) = gcd_poly a b;
neuper@48867
   783
neuper@48867
   784
a' = [(9, [0]), (3, [1]), (13, [2]), (~11, [3]), (2, [4])];
neuper@48867
   785
b' = [(~4, [0]), (~12, [1]), (~7, [2]), (3, [3]), (2, [4])];
neuper@48867
   786
c = [(~2, [0]), (~1, [1]), (1, [2])];
neuper@48867
   787
(* checking the postcondition: *)
neuper@48867
   788
if a = (a' %%*%% c) andalso b = (b' %%*%% c) then () else error "gcd_poly ex-unipoly changed";
neuper@48867
   789
(* \<forall>c'. (c' dvd\<^isub>p  a \<and> c' dvd\<^isub>p b) \<longrightarrow> c' \<le>\<^isub>p c) can NOT be checked this way, of course *)
neuper@48867
   790
neuper@48867
   791
val cu = gcd_up [~18, ~15, ~20, 12, 20, ~13, 2] [8, 28, 22, ~11, ~14, 1, 2];
neuper@48867
   792
if cu = multi_to_uni c then () else error "gcd_up <> gcd_poly";
neuper@48867
   793
neuper@48867
   794
(* example from mail to Tobias Nipkos *)
neuper@48867
   795
val a = [(1,[2, 0]), (~1,[0, 2])]; (* x^2 - y^2 *)
neuper@48867
   796
val b = [(1,[2, 0]), (~1,[1, 1])]; (* x^2 - x y *)
neuper@48867
   797
val ((a', b'), c) = gcd_poly a b;
neuper@48867
   798
neuper@52087
   799
a' = [(1, [1, 0]), (1, [0, 1])]; (* x + y  *)
neuper@52087
   800
b' = [(1, [1, 0])];              (* x      *)
neuper@52087
   801
c = [(1, [1, 0]), (~1, [0, 1])]; (* x - y  *)
neuper@48867
   802
(* checking the postcondition: *)
neuper@48867
   803
if a = (a' %%*%% c) andalso b = (b' %%*%% c) then () else error "gcd_poly mail changed";
neuper@48867
   804
(* \<forall>c'. (c' dvd\<^isub>p  a \<and> c' dvd\<^isub>p b) \<longrightarrow> c' \<le>\<^isub>p c) can NOT be checked this way, of course *)
meindl_diana@48797
   805
neuper@52098
   806
(* regression test for --- fun gcd_poly downto division by zero ---*)
neuper@52098
   807
val a = [(9, [5, 2, 4])]: poly
neuper@52098
   808
val b = [(15, [6, 3, 1])]: poly
neuper@52098
   809
val ((a', b'), c) = gcd_poly a b;
neuper@52098
   810
if a = (a' %%*%% c) andalso b = (b' %%*%% c) then () else error "regression test changed";
neuper@52098
   811
neuper@52099
   812
(* regression test for --- integration lev.1 -- lev.5 in rational.sml *)
neuper@52099
   813
val a = [(1, [0, 1, 1, 0, 1]), (1, [1, 0, 0, 1, 1])]: poly
neuper@52099
   814
val b = [(1, [0, 1, 0, 1, 1])]: poly
neuper@52099
   815
val ((a', b'), c) = gcd_poly a b;
neuper@52099
   816
neuper@52099
   817
a' = [(1, [0, 1, 1, 0, 0]), (1, [1, 0, 0, 1, 0])];
neuper@52099
   818
b' = [(1, [0, 1, 0, 1, 0])];
neuper@52099
   819
c = [(1, [0, 0, 0, 0, 1])];
neuper@52099
   820
if a = (a' %%*%% c) andalso b = (b' %%*%% c) then () else error "gcd_monom changed";
neuper@52099
   821
neuper@52097
   822
"----------- fun gcd_poly downto division by zero -------";
neuper@52097
   823
"----------- fun gcd_poly downto division by zero -------";
neuper@52097
   824
"----------- fun gcd_poly downto division by zero -------";
neuper@52098
   825
"-------- example 187a: exception Div raised...  REGRSSION TEST FOR REMOVAL OF THIS BUG IS ABOVE";
neuper@52097
   826
val a = [(12, [1, 1])]: poly
neuper@52097
   827
val b = [(8, [0, 2])]: poly;
neuper@52097
   828
(*            val ((a', b'), c) = gcd_poly a b
neuper@52097
   829
exception Div raised*)
neuper@52097
   830
"~~~~~ fun gcd_poly, args:"; val ((a as (_, es)::_ : poly), b) = (a, b);
neuper@52097
   831
(* val c = gcd_poly' a b (length es) 0
neuper@52097
   832
exception Div raised*)
neuper@52097
   833
"~~~~~ fun gcd_poly', args:"; val ((a as (_, es1)::_ : poly), (b as (_, es2)::_ : poly), n, r) =
neuper@52097
   834
  (a, b, (length es), 0);
neuper@52097
   835
lex_ord (lmonom b) (lmonom a)       = true;
neuper@52097
   836
(*gcd_poly' b a n r
neuper@52097
   837
exception Div raised*)
neuper@52097
   838
"~~~~~ fun gcd_poly', args:"; val ((a as (_, es1)::_ : poly), (b as (_, es2)::_ : poly), n, r) =
neuper@52097
   839
  (b, a, n, r);
neuper@52097
   840
lex_ord (lmonom b) (lmonom a)       = false;
neuper@52097
   841
n > 1                               = true;
neuper@52097
   842
 val M = 1 + Int.min (max_deg_var a (length es1 - 2), max_deg_var b (length es2 - 2)); 
neuper@52097
   843
(*try_new_r a b n M r [] []
neuper@52097
   844
exception Div raised*)
neuper@52097
   845
"~~~~~ and try_new_r, args:"; val (a, b, n, M, r, r_list, steps) = (a, b, n, M, r, [], []);
neuper@52097
   846
        val r = find_new_r a b r;
neuper@52097
   847
        val r_list = r_list @ [r];
neuper@52097
   848
        val g_r = gcd_poly' (order (eval a (n - 2) r)) 
neuper@52097
   849
                            (order (eval b (n - 2) r)) (n - 1) 0
neuper@52097
   850
        val steps = steps @ [g_r];
neuper@52097
   851
(*HENSEL_lifting a b n M 1 r r_list steps g_r ( zero_poly n ) [1]
neuper@52097
   852
exception Div raised*)
neuper@52097
   853
"~~~~~ and HENSEL_lifting, args:"; val (a, b, n, M, m, r, r_list, steps, g, g_n, mult) =
neuper@52097
   854
  (a, b, n, M, 1, r, r_list, steps, g_r, (zero_poly n), [1]);
neuper@52097
   855
m > M                               = false;
neuper@52097
   856
        val r = find_new_r a b r; 
neuper@52097
   857
        val r_list = r_list @ [r];
neuper@52097
   858
        val g_r = gcd_poly' (order (eval a (n - 2) r)) 
neuper@52097
   859
                            (order (eval b (n - 2) r)) (n - 1) 0;
neuper@52097
   860
lex_ord (lmonom g) (lmonom g_r)     = false;
neuper@52097
   861
lexp g = lexp g_r                   = true;
neuper@52097
   862
val (g_n, new, steps) = NEWTON r_list [g, g_r] steps mult g_n (n - 2);
neuper@52097
   863
nth steps (length steps - 1) = zero_poly (n - 1)    = false;
neuper@52097
   864
(*HENSEL_lifting a b n M (m + 1) r r_list steps g_r g_n new
neuper@52097
   865
exception Div raised*)
neuper@52097
   866
"~~~~~ and HENSEL_lifting, args:"; val (a, b, n, M, m, r, r_list, steps, g, g_n, mult) =
neuper@52097
   867
  (a, b, n, M, m + 1, r, r_list, steps, g_r, g_n, new);
neuper@52097
   868
m > M                               = true;
neuper@52097
   869
(g_n %%|%% a andalso (g_n %%|%% b)) = false;
neuper@52097
   870
(*try_new_r a b n M r r_list steps
neuper@52097
   871
exception Div raised*)
neuper@52097
   872
"~~~~~ and try_new_r, args:"; val (a, b, n, M, r, r_list, steps) = (a, b, n, M, r, r_list, steps);
neuper@52097
   873
        val r = find_new_r a b r;
neuper@52097
   874
        val r_list = r_list @ [r];
neuper@52097
   875
        val g_r = gcd_poly' (order (eval a (n - 2) r)) 
neuper@52097
   876
                            (order (eval b (n - 2) r)) (n - 1) 0
neuper@52097
   877
        val steps = steps @ [g_r];
neuper@52097
   878
(*HENSEL_lifting a b n M 1 r r_list steps g_r (zero_poly n) [1]
neuper@52097
   879
exception Div raised*)
neuper@52097
   880
"~~~~~ and HENSEL_lifting, args:"; val (a, b, n, M, m, r, r_list, steps, g, g_n, mult) =
neuper@52097
   881
  (a, b, n, M, 1, r, r_list, steps, g_r, zero_poly n, [1]);
neuper@52097
   882
m > M                               = false;
neuper@52097
   883
        val r = find_new_r a b r; 
neuper@52097
   884
        val r_list = r_list @ [r];
neuper@52097
   885
        val g_r = gcd_poly' (order (eval a (n - 2) r)) 
neuper@52097
   886
                            (order (eval b (n - 2) r)) (n - 1) 0;
neuper@52097
   887
lex_ord (lmonom g) (lmonom g_r)     = false;
neuper@52097
   888
lexp g = lexp g_r                   = true;
neuper@52097
   889
val (g_n, new, steps) = NEWTON r_list [g, g_r] steps mult g_n (n - 2);
neuper@52097
   890
(nth steps (length steps - 1) = zero_poly (n - 1))  = false;
neuper@52097
   891
(*HENSEL_lifting a b n M (m + 1) r r_list steps g_r g_n new
neuper@52097
   892
exception Div raised*)
neuper@52097
   893
"~~~~~ and HENSEL_lifting, args:"; val (a, b, n, M, m, r, r_list, steps, g, g_n, mult) =
neuper@52097
   894
  (a, b, n, M, m + 1, r, r_list, steps, g_r, g_n, new);
neuper@52097
   895
m > M                               = true;
neuper@52097
   896
(g_n %%|%% a andalso g_n %%|%% b)   = false;
neuper@52097
   897
(*try_new_r a b n M r r_list steps
neuper@52097
   898
exception Div raised*)
neuper@52097
   899
"~~~~~ and try_new_r, args:"; val (a, b, n, M, r, r_list, steps) = (a, b, n, M, r, r_list, steps);
neuper@52097
   900
        val r = find_new_r a b r;
neuper@52097
   901
        val r_list = r_list @ [r];
neuper@52097
   902
        val g_r = gcd_poly' (order (eval a (n - 2) r)) 
neuper@52097
   903
                            (order (eval b (n - 2) r)) (n - 1) 0
neuper@52097
   904
        val steps = steps @ [g_r];
neuper@52097
   905
(*HENSEL_lifting a b n M 1 r r_list steps g_r (zero_poly n) [1]
neuper@52097
   906
exception Div raised*)
neuper@52097
   907
"~~~~~ and HENSEL_lifting, args:"; val (a, b, n, M, m, r, r_list, steps, g, g_n, mult) =
neuper@52097
   908
  (a, b, n, M, 1, r, r_list, steps, g_r, zero_poly n, [1]);
neuper@52097
   909
m > M                               = false;
neuper@52097
   910
        val r = find_new_r a b r; 
neuper@52097
   911
        val r_list = r_list @ [r];
neuper@52097
   912
        val g_r = gcd_poly' (order (eval a (n - 2) r)) 
neuper@52097
   913
                            (order (eval b (n - 2) r)) (n - 1) 0;
neuper@52097
   914
lex_ord (lmonom g) (lmonom g_r)     = false;
neuper@52097
   915
lexp g = lexp g_r                   = true;
neuper@52097
   916
val (g_n, new, steps) = NEWTON r_list [g, g_r] steps mult g_n (n - 2);
neuper@52097
   917
nth steps (length steps - 1) = zero_poly (n - 1)     = true;
neuper@52097
   918
(*HENSEL_lifting a b n M (M + 1) r r_list steps g_r g_n new
neuper@52097
   919
exception Div raised*)
neuper@52097
   920
"~~~~~ and HENSEL_lifting, args:"; val (a, b, n, M, m, r, r_list, steps, g, g_n, mult) =
neuper@52097
   921
  (a, b, n, M, m + 1, r, r_list, steps, g_r, g_n, new);
neuper@52097
   922
m > M                               = true;
neuper@52097
   923
(*(g_n %%|%% a andalso g_n %%|%% b);
neuper@52097
   924
exception Div raised:                !!!!! g_n = [(0, [0, 0])] !!!!!*)
neuper@52097
   925
neuper@52063
   926
"=========== prep Lucas-Interpretation ==================";
neuper@52077
   927
"----------- fun for_quot_regarding ---------------------";
neuper@52077
   928
"----------- fun for_quot_regarding ---------------------";
neuper@52077
   929
"----------- fun for_quot_regarding ---------------------";
neuper@52077
   930
(* -> quot' = [] @ [2] @ (3 * [])*)
neuper@52077
   931
"~~~~~ fun for_quot_regarding, args:"; val (p1, p2, p1', quot, remd) =
neuper@52077
   932
  ([2, 2, 2, 2, 2], [1, 2, 3], [2, 2, 2, 2, 2], [], [6, 6, 4, 2]);
neuper@52077
   933
       val zeros = deg_up p1' - deg_up remd - 1(*length [q]*)  (* = 0*)
neuper@52077
   934
       val max_qot_deg = deg_up p1 - deg_up p2                 (* = 2*)
neuper@52077
   935
;
neuper@52077
   936
zeros + 1(*length [q]*) + deg_up quot > max_qot_deg   = false
neuper@52077
   937
;
neuper@52077
   938
if for_quot_regarding p1 p2 p1' quot remd = 0 then () 
neuper@52077
   939
else error "for_quot_regarding 1 changed"
neuper@52077
   940
neuper@52077
   941
neuper@52077
   942
(* -> quot' = [0, 0, 0] @ [1] @ (1 * [])*)
neuper@52077
   943
"~~~~~ fun for_quot_regarding, args:"; val (p1, p2, p1', quot, remd) =
neuper@52077
   944
  ([3, 2, 2, 2, 1, 1, 1, 1], [1, 1, 1, 1], [3, 2, 2, 2, 1, 1, 1, 1], [], [3, 2, 2, 2]);
neuper@52077
   945
       val zeros = deg_up p1' - deg_up remd - 1(*length [q]*)  (* = 3*)
neuper@52077
   946
       val max_qot_deg = deg_up p1 - deg_up p2                 (* = 4*)
neuper@52077
   947
;
neuper@52077
   948
zeros + 1(*length [q]*) + deg_up quot > max_qot_deg   = false
neuper@52077
   949
;
neuper@52077
   950
if for_quot_regarding p1 p2 p1' quot remd = 3 then () 
neuper@52077
   951
else error "for_quot_regarding 2 changed"
neuper@52077
   952
neuper@52077
   953
neuper@52077
   954
(* -> quot' = [] @ [2] @ (1 * [0, 0, 0, 1])*)
neuper@52077
   955
"~~~~~ fun for_quot_regarding, args:"; val (p1, p2, p1', quot, remd) =
neuper@52077
   956
  ([3, 2, 2, 2, 1, 1, 1, 1], [1, 1, 1, 1], [3, 2, 2, 2], [0, 0, 0, 1], [1]);
neuper@52077
   957
       val zeros = deg_up p1' - deg_up remd - 1(*length [q]*)  (* = 2*)
neuper@52077
   958
       val max_qot_deg = deg_up p1 - deg_up p2                 (* = 4*)
neuper@52077
   959
;
neuper@52077
   960
zeros + 1(*length [q]*) + deg_up quot > max_qot_deg   = true
neuper@52077
   961
;
neuper@52077
   962
   for_quot_regarding p1 p2 p1' quot remd;
neuper@52077
   963
if for_quot_regarding p1 p2 p1' quot remd = 0 then () 
neuper@52077
   964
else error "for_quot_regarding 3 changed";
neuper@52077
   965
neuper@52077
   966
neuper@52077
   967
"----------- fun mult_to_deg - --------------------------";
neuper@52077
   968
"----------- fun mult_to_deg - --------------------------";
neuper@52077
   969
"----------- fun mult_to_deg - --------------------------";
neuper@52063
   970
  val p1 = [2,2,2, 2,2,2];
neuper@52063
   971
  val p2 = [7,8,6];
neuper@52077
   972
if mult_to_deg (deg_up p1) p2 = [0, 0, 0, 7, 8, 6] then () else error "fun mult_to_deg changed";
neuper@52063
   973
neuper@52063
   974
"----------- fun fact_quot ------------------------------";
neuper@52063
   975
"----------- fun fact_quot ------------------------------";
neuper@52063
   976
"----------- fun fact_quot ------------------------------";
neuper@52063
   977
  fact_quot 18 8 = (4, 9);
neuper@52063
   978
  fact_quot 2 6 = (3, 1);
neuper@52063
   979
  fact_quot ~2 6 = (3, ~1);
neuper@52063
   980
  fact_quot 5 6 = (6, 5);
neuper@52077
   981
if fact_quot 110 6 = (3, 55) then () else error "fun fact_quot changed 1";
neuper@52077
   982
(* this works, if (several) position(s) in the dividend are 0: *)
neuper@52077
   983
if fact_quot 0 3 = (1, 0) then () else error "fun fact_quot changed 2";
neuper@52063
   984
neuper@52063
   985
"----------- fun %+% ------------------------------------";
neuper@52063
   986
"----------- fun %+% ------------------------------------";
neuper@52063
   987
"----------- fun %+% ------------------------------------";
neuper@52063
   988
if (p1 %+% p2) = [9, 10, 8, 2, 2, 2] andalso (p2 %+% p1) = [9, 10, 8, 2, 2, 2]
neuper@52063
   989
  then () else error "fun %+% changed";
neuper@52063
   990
neuper@52063
   991
"----------- fun %*% ------------------------------------";
neuper@52063
   992
"----------- fun %*% ------------------------------------";
neuper@52063
   993
"----------- fun %*% ------------------------------------";
neuper@52063
   994
if ([1,2,1] %*% [1,3,3,1]) = [1, 5, 10, 10, 5, 1] then () else error "fun %*% changed";
neuper@52063
   995
neuper@52063
   996
"----------- fun %*/% -----------------------------------";
neuper@52063
   997
"----------- fun %*/% -----------------------------------";
neuper@52063
   998
"----------- fun %*/% -----------------------------------";
neuper@52063
   999
val p1 = [2,2,2, 2,2,2];
neuper@52063
  1000
val p2 = [7, 8, 6];
neuper@52063
  1001
val (n (* = 162*), 
neuper@52063
  1002
     q (* = [29, ~33, ~18, 54]*), 
neuper@52063
  1003
     r (* = [317, 295]*)) = p1 %*/% p2;
neuper@52063
  1004
if (p1 %* n) = ((q %*% p2) %+% r) then () else error "fun %*/% changed 1";
neuper@52063
  1005
neuper@52063
  1006
(* demo in GCD_Poly *)
neuper@52063
  1007
val p1 = [2, 2, 2, 2, 2];
neuper@52063
  1008
val p2 = [1, 2, 3];
neuper@52063
  1009
val (n (* = 27*), 
neuper@52063
  1010
     q (* = [8, 6, 18]*), 
neuper@52063
  1011
     r (* = [46, 32]*)) = p1 %*/% p2;
neuper@52063
  1012
if (p1 %* n) = ((q %*% p2) %+% r) then () else error "fun %*/% changed 2";
neuper@52063
  1013
neuper@52077
  1014
"~~~~~ fun div_int_up, args:"; val (p1, p1', p2, quot, ns) = (p1, p1, p2, [], 1);
neuper@52077
  1015
      val (n, q) = fact_quot (lcoeff_up p1') (lcoeff_up p2);
neuper@52077
  1016
      val remd = drop_tl_zeros ((p1' %* n) %-% (mult_to_deg (deg_up p1') p2 %* q));
neuper@52077
  1017
      val zeros = for_quot_regarding p1 p2 p1' quot remd;
neuper@52077
  1018
"~~~~~ fun writeln_trace, args:"; val (p1, p1', p2, quot, n, q ,(zeros:int), remd, (ns: int)) = 
neuper@52077
  1019
  (p1, p1', p2, quot, n, q, zeros, remd, ns);
neuper@52077
  1020
"~~~~~ fun div_invariant2, args:"; val (p1, p2, n, ns, zeros, q, quot, remd) = 
neuper@52077
  1021
  (p1, p2, n, ns, zeros, q, quot, remd);
neuper@52077
  1022
if (p1 %* (n * ns)) = 
neuper@52077
  1023
((mult_to_deg (deg_up p1 - deg_up p2) ((replicate zeros 0) @ [q] @ (quot %* n))) %*% p2 %+% remd)
neuper@52077
  1024
then () else error "div_int_up: invariant 2 does not hold"
neuper@52077
  1025
neuper@52077
  1026
neuper@52077
  1027
"----------- fun %*/% Subscript raised (line 509 of lib--";
neuper@52077
  1028
"----------- fun %*/% Subscript raised (line 509 of lib--";
neuper@52077
  1029
"----------- fun %*/% Subscript raised (line 509 of lib--";
neuper@52077
  1030
  val p1 = [3,2,2,2,1,1,1,1];
neuper@52077
  1031
  val p2 = [1,1,1,1];
neuper@52077
  1032
"~~~~~ fun div_int_up, args:"; val (p1, p1', p2, quot, ns) = (p1, p1, p2, [], 1);
neuper@52077
  1033
      val (n, q) = fact_quot (lcoeff_up p1') (lcoeff_up p2);
neuper@52077
  1034
      val remd = drop_tl_zeros ((p1' %* n) %-% (mult_to_deg (deg_up p1') p2 %* q));
neuper@52077
  1035
      val zeros = for_quot_regarding p1 p2 p1' quot remd
neuper@52077
  1036
      val _ = writeln_trace p1 p1' p2 quot n q zeros remd ns
neuper@52077
  1037
      val quot = (replicate zeros 0) @ [q] @ (quot %* n)
neuper@52077
  1038
      val ns = n * ns;
neuper@52077
  1039
deg_up remd >= deg_up p2      = true;
neuper@52077
  1040
"~~~~~ fun div_int_up, args:"; val (p1, p1', p2, quot, ns) = (p1, remd, p2, quot, ns);
neuper@52077
  1041
      val (n, q) = fact_quot (lcoeff_up p1') (lcoeff_up p2);
neuper@52077
  1042
      val remd = drop_tl_zeros ((p1' %* n) %-% (mult_to_deg (deg_up p1') p2 %* q));
neuper@52077
  1043
      val zeros = for_quot_regarding p1 p2 p1' quot remd;
neuper@52077
  1044
"~~~~~ fun writeln_trace, args:"; val (p1, p1', p2, quot, n, q, (zeros:int), remd, (ns: int))=
neuper@52077
  1045
  (p1, p1', p2, quot, n, q, zeros, remd, ns);
neuper@52077
  1046
      if (p1 %* (n * ns)) = 
neuper@52077
  1047
        ((mult_to_deg (deg_up p1 - deg_up p2) 
neuper@52077
  1048
          (((replicate zeros 0) @ [q] @ (quot %* n))) %*% p2 %+% remd))
neuper@52077
  1049
      then () else error "writeln_trace changed"
neuper@52077
  1050
;
neuper@52077
  1051
;
neuper@52077
  1052
;
neuper@52077
  1053
      val quot = (replicate zeros 0) @ [q] @ (quot %* n)
neuper@52077
  1054
      val ns = n * ns;
neuper@52077
  1055
deg_up remd >= deg_up p2       = false;
neuper@52077
  1056
  val (n (* = 1*), 
neuper@52077
  1057
       q (* = [2, 0, 0, 0, 1]*), 
neuper@52077
  1058
       r (* = [1]*)) = (ns, quot, remd)
neuper@52077
  1059
;
neuper@52077
  1060
  if (p1 %* n) = ((q %*% p2) %+% r) then () else error "fun %*/% changed x"
neuper@52077
  1061
neuper@52063
  1062
"----------- fun EUCLID_naive_up ------------------------";
neuper@52063
  1063
"----------- fun EUCLID_naive_up ------------------------";
neuper@52063
  1064
"----------- fun EUCLID_naive_up ------------------------";
neuper@52077
  1065
  val a = [0,~1,1]; (* -x + x^2 =  x   *(-1 + x) *)
neuper@52077
  1066
  val b = [~1,0,1]; (* -1 + x^2 = (1+x)*(-1 + x) *)
neuper@52077
  1067
(*EUCLID_naive_up a b; (* = [1, ~1]*) (*( 1 - x) *)
neuper@52077
  1068
ERROR: invariant 2 does not hold: [~1, 0, 1] * ~1 = [~1, ~1] ** [1, ~1] ++ [0, 0, 0, 0]*)
neuper@52077
  1069
;
neuper@52077
  1070
"~~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (a, b);
neuper@52077
  1071
deg_up a < deg_up b    = false;
neuper@52077
  1072
        val (n, q, r) = a %*/% b
neuper@52077
  1073
(*EUCLID_naive_up b r
neuper@52077
  1074
ERROR: invariant 2 does not hold: [~1, 0, 1] * ~1 = [~1, ~1] ** [1, ~1] ++ [0, 0, 0, 0]*)
neuper@52077
  1075
;
neuper@52077
  1076
"~~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (b, r);
neuper@52077
  1077
(*      val (n, q, r) = a %*/% b
neuper@52077
  1078
invariant 2 does not hold: [~1, 0, 1] * ~1 = [~1, ~1] ** [1, ~1] ++ [0, 0, 0, 0]*)
neuper@52077
  1079
;
neuper@52077
  1080
"~~~~~ fun %*/%, args:"; val (p1, p2) = (a, b);
neuper@52077
  1081
(*    val (n, q, r) = div_int_up p1 p1 p2 [] 1
neuper@52077
  1082
invariant 2 does not hold: [~1, 0, 1] * ~1 = [~1, ~1] ** [1, ~1] ++ [0, 0, 0, 0]*)
neuper@52077
  1083
;
neuper@52077
  1084
"~~~~~ fun div_int_up, args:"; val (p1, p1', p2, quot, ns) = (p1, p1, p2, [], 1);
neuper@52077
  1085
      val (n, q) = fact_quot (lcoeff_up p1') (lcoeff_up p2);
neuper@52077
  1086
      val remd = drop_tl_zeros ((p1' %* n) %-% (mult_to_deg (deg_up p1') p2 %* q));
neuper@52077
  1087
      val zeros = for_quot_regarding p1 p2 p1' quot remd
neuper@52077
  1088
      val _ = writeln_trace p1 p1' p2 quot n q zeros remd ns
neuper@52077
  1089
      val quot = (replicate zeros 0) @ [q] @ (quot %* n)
neuper@52077
  1090
      val ns = n * ns;
neuper@52077
  1091
deg_up remd >= deg_up p2   = true;
neuper@52077
  1092
(*div_int_up p1 remd p2 quot ns
neuper@52077
  1093
invariant 2 does not hold: [~1, 0, 1] * ~1 = [~1, ~1] ** [1, ~1] ++ [0, 0, 0, 0]*)
neuper@52077
  1094
;
neuper@52077
  1095
"~~~~~ fun div_int_up, args:"; val (p1, p1', p2, quot, ns) = ( p1, remd, p2, quot, ns);
neuper@52077
  1096
      val (n, q) = fact_quot (lcoeff_up p1') (lcoeff_up p2);
neuper@52077
  1097
      val remd = drop_tl_zeros ((p1' %* n) %-% (mult_to_deg (deg_up p1') p2 %* q));
neuper@52077
  1098
      val zeros = for_quot_regarding p1 p2 p1' quot remd
neuper@52077
  1099
(*    val _ = writeln_trace p1 p1' p2 quot n q zeros remd ns
neuper@52077
  1100
invariant 2 does not hold: [~1, 0, 1] * ~1 = [~1, ~1] ** [1, ~1] ++ [0, 0, 0, 0]*)
neuper@52077
  1101
;
neuper@52077
  1102
"~~~~~ fun writeln_trace, args:"; val (p1, p1', p2, quot, n, q ,(zeros:int), remd, (ns: int))= 
neuper@52077
  1103
  (p1, p1', p2, quot, n, q, zeros, remd, ns);
neuper@52077
  1104
(*if (p1 %* (n * ns)) = 
neuper@52077
  1105
((mult_to_deg (deg_up p1 - deg_up p2) ((replicate zeros 0) @ [q] @ (quot %* n))) %*% p2 %+% remd)
neuper@52077
  1106
then () else error "div_int_up: invariant 2 does not hold"
neuper@52077
  1107
ERROR: div_int_up: invariant 2 does not hold*)
neuper@52077
  1108
(p1 %* (n * ns)) = [1, 0, ~1]; (* ERROR came from fact_quot with n<0 *)
neuper@52077
  1109
((mult_to_deg (deg_up p1 - deg_up p2) ((replicate zeros 0) @ [q] @ (quot %* n))) %*% p2 %+% remd) =
neuper@52077
  1110
  [~1, 0, 1];
neuper@52077
  1111
neuper@52077
  1112
if (p1 %* (abs n * ns)) = 
neuper@52077
  1113
  ((mult_to_deg (deg_up p1 - deg_up p2) ((replicate zeros 0) @ [q] @ (quot %* n))) %*% p2 %+% remd)
neuper@52077
  1114
then () else error "div_int_up: invariant 2 does not hold in ~~~~~ fun Euclid_naive";
neuper@52077
  1115
neuper@52077
  1116
neuper@52063
  1117
val a = [~1,0,0,1]; (* -1 + x^3 = (1+x+x^2)*(-1 + x) *)
neuper@52063
  1118
val b = [0,~1,1];   (* -x + x^2 = x        *(-1 + x) *)
neuper@52063
  1119
if EUCLID_naive_up a b = [~1, 1]             (*(-1 + x) *)
neuper@52063
  1120
 then () else error "fun EUCLID_naive_up changed 1";
neuper@52063
  1121
neuper@52063
  1122
val a = [0,~1,0,0,1]; (* -x + x^4 = x*(1+x+x^2)*(-1 + x) *)
neuper@52063
  1123
val b = [~2,2];       (* -x + x^2 =  2         *(-1 + x) *)
neuper@52063
  1124
if EUCLID_naive_up a b = [~1, 1] then () else error "fun EUCLID_naive_up changed 2";
neuper@52063
  1125
neuper@52063
  1126
val a = [~5,2,8,~3,~3,0,1,0,1];
neuper@52063
  1127
val b = [21,~9,~4,5,0,3];
neuper@52063
  1128
if EUCLID_naive_up a b = [1] then () else error "fun EUCLID_naive_up changed 3";
neuper@52063
  1129
neuper@52063
  1130
val a = [~18, ~15, ~20, 12, 20, ~13, 2];
neuper@52063
  1131
val b = [8, 28, 22, ~11, ~14, 1, 2];
neuper@52063
  1132
if EUCLID_naive_up a b = [~2, ~1, 1] then () else error "fun EUCLID_naive_up changed 4";
neuper@52063
  1133
neuper@52080
  1134
"----------- last step in EUCLID ------------------------";
neuper@52080
  1135
"----------- last step in EUCLID ------------------------";
neuper@52080
  1136
"----------- last step in EUCLID ------------------------";
neuper@52080
  1137
trace_div := false;
neuper@52080
  1138
trace_div_invariant := false;
neuper@52080
  1139
trace_Euclid := false;
neuper@52080
  1140
val a = [~18, ~15, ~20, 12, 20, ~13, 2];
neuper@52080
  1141
val b = [8, 28, 22, ~11, ~14, 1, 2];
neuper@52080
  1142
"~1~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (a, b);
neuper@52080
  1143
        val (n, q, r) = a %*/% b;
neuper@52080
  1144
"~2~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (b, r);
neuper@52080
  1145
        val (n, q, r) = a %*/% b;
neuper@52080
  1146
"~3~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (b, r);
neuper@52080
  1147
        val (n, q, r) = a %*/% b;
neuper@52080
  1148
"~4~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (b, r);
neuper@52080
  1149
        val (n, q, r) = a %*/% b;
neuper@52080
  1150
"~5~~~~ fun EUCLID_naive_up, args:"; val (a, b) = (b, r);
neuper@52080
  1151
(*      val (n, q, r) = a %*/% b;*)
neuper@52080
  1152
"~~~~~ fun %*/%, args:"; val (p1, p2) = (a, b);
neuper@52080
  1153
(*div_int_up p1 p1 p2 [] 1*)
neuper@52080
  1154
"~~~~~ fun div_int_up, args:"; val (p1, p1', p2, quot, ns) = (p1, p1, p2, [], 1);
neuper@52080
  1155
(*
neuper@52080
  1156
val p1 = [~1316434, ~3708859, ~867104, 1525321]: int list
neuper@52080
  1157
val p1' = [~1316434, ~3708859, ~867104, 1525321]: int list
neuper@52080
  1158
val p2 = [~5000595353600, ~2500297676800, 2500297676800]: int list
neuper@52080
  1159
val quot = []: 'a list
neuper@52080
  1160
val ns = 1: int
neuper@52080
  1161
*)
neuper@52080
  1162
      val (n, q) = fact_quot (lcoeff_up p1') (lcoeff_up p2)
neuper@52080
  1163
(*n = 7289497600, q = 4447*)
neuper@52080
  1164
      val remd = drop_tl_zeros ((p1' %* n) %-% (mult_to_deg (deg_up p1') p2 %* q))
neuper@52080
  1165
(*remd = [~9596142483558400, ~4798071241779200, 4798071241779200]*)
neuper@52080
  1166
     val zeros = for_quot_regarding p1 p2 p1' quot remd
neuper@52080
  1167
(*0*)
neuper@52080
  1168
      val _ = writeln_trace p1 p1' p2 quot n q zeros remd ns
neuper@52080
  1169
(**)
neuper@52080
  1170
      val quot = (replicate zeros 0) @ [q] @ (quot %* n)
neuper@52080
  1171
(*quot = [4447]*)
neuper@52080
  1172
      val ns = n * ns
neuper@52080
  1173
(*ns = 7289497600*)
neuper@52080
  1174
        val (n, q, r) = a %*/% b;
neuper@52080
  1175
"~6~~~~ fun EUCLID_naive_up, args:"; val (a, []) = (b, r);
neuper@52077
  1176
neuper@48813
  1177
" ========== END ======================================= ";
neuper@52074
  1178
  fun nth _ []      = error "nth _ []" (*Isabelle2002, still saved the hours of update*)
neuper@52074
  1179
    | nth 1 (x::_) = x
neuper@52074
  1180
    | nth n (_::xs) = nth (n-1) xs;
neuper@52074
  1181
(*fun nth xs i = List.nth (xs, i);       recent Isabelle: TODO update all isac code   *)
neuper@48834
  1182