src/HOL/Integ/nat_bin.ML
changeset 14251 b91f632a1d37
parent 13837 8dd150d36c65
equal deleted inserted replaced
14250:d09e92e7c2bf 14251:b91f632a1d37
     6 Binary arithmetic for the natural numbers
     6 Binary arithmetic for the natural numbers
     7 *)
     7 *)
     8 
     8 
     9 val nat_number_of_def = thm "nat_number_of_def";
     9 val nat_number_of_def = thm "nat_number_of_def";
    10 
    10 
       
    11 val ss_Int = simpset_of Int_thy;
    11 
    12 
    12 (** nat (coercion from int to nat) **)
    13 (** nat (coercion from int to nat) **)
    13 
    14 
    14 Goal "nat (number_of w) = number_of w";
    15 Goal "nat (number_of w) = number_of w";
    15 by (simp_tac (simpset() addsimps [nat_number_of_def]) 1);
    16 by (simp_tac (simpset() addsimps [nat_number_of_def]) 1);
    81 (*"neg" is used in rewrite rules for binary comparisons*)
    82 (*"neg" is used in rewrite rules for binary comparisons*)
    82 Goal "int (number_of v :: nat) = \
    83 Goal "int (number_of v :: nat) = \
    83 \        (if neg (number_of v) then 0 \
    84 \        (if neg (number_of v) then 0 \
    84 \         else (number_of v :: int))";
    85 \         else (number_of v :: int))";
    85 by (simp_tac
    86 by (simp_tac
    86     (simpset_of Int.thy addsimps [neg_nat, nat_number_of_def, 
    87     (ss_Int addsimps [neg_nat, nat_number_of_def, not_neg_nat, int_0]) 1);
    87 				  not_neg_nat, int_0]) 1);
       
    88 qed "int_nat_number_of";
    88 qed "int_nat_number_of";
    89 Addsimps [int_nat_number_of];
    89 Addsimps [int_nat_number_of];
    90 
    90 
    91 
    91 
    92 (** Successor **)
    92 (** Successor **)
    96 by (asm_simp_tac (simpset() addsimps [nat_eq_iff, int_Suc]) 1);
    96 by (asm_simp_tac (simpset() addsimps [nat_eq_iff, int_Suc]) 1);
    97 qed "Suc_nat_eq_nat_zadd1";
    97 qed "Suc_nat_eq_nat_zadd1";
    98 
    98 
    99 Goal "Suc (number_of v + n) = \
    99 Goal "Suc (number_of v + n) = \
   100 \       (if neg (number_of v) then 1+n else number_of (bin_succ v) + n)";
   100 \       (if neg (number_of v) then 1+n else number_of (bin_succ v) + n)";
   101 by (simp_tac
   101 by (simp_tac (ss_Int addsimps [neg_nat, nat_1, not_neg_eq_ge_0, 
   102     (simpset_of Int.thy addsimps [neg_nat, nat_1, not_neg_eq_ge_0, 
   102 		               nat_number_of_def, int_Suc, 
   103 				  nat_number_of_def, int_Suc, 
   103 		               Suc_nat_eq_nat_zadd1, number_of_succ]) 1);
   104 				  Suc_nat_eq_nat_zadd1, number_of_succ]) 1);
       
   105 qed "Suc_nat_number_of_add";
   104 qed "Suc_nat_number_of_add";
   106 
   105 
   107 Goal "Suc (number_of v) = \
   106 Goal "Suc (number_of v) = \
   108 \       (if neg (number_of v) then 1 else number_of (bin_succ v))";
   107 \       (if neg (number_of v) then 1 else number_of (bin_succ v))";
   109 by (cut_inst_tac [("n","0")] Suc_nat_number_of_add 1);
   108 by (cut_inst_tac [("n","0")] Suc_nat_number_of_add 1);
   126 (*"neg" is used in rewrite rules for binary comparisons*)
   125 (*"neg" is used in rewrite rules for binary comparisons*)
   127 Goal "(number_of v :: nat) + number_of v' = \
   126 Goal "(number_of v :: nat) + number_of v' = \
   128 \        (if neg (number_of v) then number_of v' \
   127 \        (if neg (number_of v) then number_of v' \
   129 \         else if neg (number_of v') then number_of v \
   128 \         else if neg (number_of v') then number_of v \
   130 \         else number_of (bin_add v v'))";
   129 \         else number_of (bin_add v v'))";
   131 by (simp_tac
   130 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   132     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   131 		  	       nat_add_distrib RS sym, number_of_add]) 1);
   133 				  nat_add_distrib RS sym, number_of_add]) 1);
       
   134 qed "add_nat_number_of";
   132 qed "add_nat_number_of";
   135 
   133 
   136 Addsimps [add_nat_number_of];
   134 Addsimps [add_nat_number_of];
   137 
   135 
   138 
   136 
   150 Goalw [nat_number_of_def]
   148 Goalw [nat_number_of_def]
   151      "(number_of v :: nat) - number_of v' = \
   149      "(number_of v :: nat) - number_of v' = \
   152 \       (if neg (number_of v') then number_of v \
   150 \       (if neg (number_of v') then number_of v \
   153 \        else let d = number_of (bin_add v (bin_minus v')) in    \
   151 \        else let d = number_of (bin_add v (bin_minus v')) in    \
   154 \             if neg d then 0 else nat d)";
   152 \             if neg d then 0 else nat d)";
   155 by (simp_tac
   153 by (simp_tac (ss_Int delcongs [if_weak_cong]
   156     (simpset_of Int.thy delcongs [if_weak_cong]
   154 		     addsimps [not_neg_eq_ge_0, nat_0,
   157 			addsimps [not_neg_eq_ge_0, nat_0,
   155 			       diff_nat_eq_if, diff_number_of_eq]) 1);
   158 				  diff_nat_eq_if, diff_number_of_eq]) 1);
       
   159 qed "diff_nat_number_of";
   156 qed "diff_nat_number_of";
   160 
   157 
   161 Addsimps [diff_nat_number_of];
   158 Addsimps [diff_nat_number_of];
   162 
   159 
   163 
   160 
   164 (** Multiplication **)
   161 (** Multiplication **)
   165 
   162 
   166 Goal "(number_of v :: nat) * number_of v' = \
   163 Goal "(number_of v :: nat) * number_of v' = \
   167 \      (if neg (number_of v) then 0 else number_of (bin_mult v v'))";
   164 \      (if neg (number_of v) then 0 else number_of (bin_mult v v'))";
   168 by (simp_tac
   165 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   169     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   166 		               nat_mult_distrib RS sym, number_of_mult, 
   170 				  nat_mult_distrib RS sym, number_of_mult, 
   167 			       nat_0]) 1);
   171 				  nat_0]) 1);
       
   172 qed "mult_nat_number_of";
   168 qed "mult_nat_number_of";
   173 
   169 
   174 Addsimps [mult_nat_number_of];
   170 Addsimps [mult_nat_number_of];
   175 
   171 
   176 
   172 
   177 (** Quotient **)
   173 (** Quotient **)
   178 
   174 
   179 Goal "(number_of v :: nat)  div  number_of v' = \
   175 Goal "(number_of v :: nat)  div  number_of v' = \
   180 \         (if neg (number_of v) then 0 \
   176 \         (if neg (number_of v) then 0 \
   181 \          else nat (number_of v div number_of v'))";
   177 \          else nat (number_of v div number_of v'))";
   182 by (simp_tac
   178 by (simp_tac (ss_Int addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, 
   183     (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, neg_nat, 
   179 			       nat_div_distrib RS sym, nat_0]) 1);
   184 				  nat_div_distrib RS sym, nat_0]) 1);
       
   185 qed "div_nat_number_of";
   180 qed "div_nat_number_of";
   186 
   181 
   187 Addsimps [div_nat_number_of];
   182 Addsimps [div_nat_number_of];
   188 
   183 
   189 
   184 
   191 
   186 
   192 Goal "(number_of v :: nat)  mod  number_of v' = \
   187 Goal "(number_of v :: nat)  mod  number_of v' = \
   193 \       (if neg (number_of v) then 0 \
   188 \       (if neg (number_of v) then 0 \
   194 \        else if neg (number_of v') then number_of v \
   189 \        else if neg (number_of v') then number_of v \
   195 \        else nat (number_of v mod number_of v'))";
   190 \        else nat (number_of v mod number_of v'))";
   196 by (simp_tac
   191 by (simp_tac (ss_Int addsimps [not_neg_eq_ge_0, nat_number_of_def, 
   197     (simpset_of Int.thy addsimps [not_neg_eq_ge_0, nat_number_of_def, 
   192                                neg_nat, nat_0, DIVISION_BY_ZERO_MOD,
   198 				  neg_nat, nat_0, DIVISION_BY_ZERO_MOD,
   193                                nat_mod_distrib RS sym]) 1);
   199 				  nat_mod_distrib RS sym]) 1);
       
   200 qed "mod_nat_number_of";
   194 qed "mod_nat_number_of";
   201 
   195 
   202 Addsimps [mod_nat_number_of];
   196 Addsimps [mod_nat_number_of];
   203 
   197 
   204 structure NatAbstractNumeralsData =
   198 structure NatAbstractNumeralsData =
   233 (*"neg" is used in rewrite rules for binary comparisons*)
   227 (*"neg" is used in rewrite rules for binary comparisons*)
   234 Goal "((number_of v :: nat) = number_of v') = \
   228 Goal "((number_of v :: nat) = number_of v') = \
   235 \     (if neg (number_of v) then (iszero (number_of v') | neg (number_of v')) \
   229 \     (if neg (number_of v) then (iszero (number_of v') | neg (number_of v')) \
   236 \      else if neg (number_of v') then iszero (number_of v) \
   230 \      else if neg (number_of v') then iszero (number_of v) \
   237 \      else iszero (number_of (bin_add v (bin_minus v'))))";
   231 \      else iszero (number_of (bin_add v (bin_minus v'))))";
   238 by (simp_tac
   232 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   239     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   233                                eq_nat_nat_iff, eq_number_of_eq, nat_0]) 1);
   240 				  eq_nat_nat_iff, eq_number_of_eq, nat_0]) 1);
   234 by (simp_tac (ss_Int addsimps [nat_eq_iff, nat_eq_iff2, iszero_def]) 1);
   241 by (simp_tac (simpset_of Int.thy addsimps [nat_eq_iff, nat_eq_iff2, 
       
   242 					   iszero_def]) 1);
       
   243 by (simp_tac (simpset () addsimps [not_neg_eq_ge_0 RS sym]) 1);
   235 by (simp_tac (simpset () addsimps [not_neg_eq_ge_0 RS sym]) 1);
   244 qed "eq_nat_number_of";
   236 qed "eq_nat_number_of";
   245 
   237 
   246 Addsimps [eq_nat_number_of];
   238 Addsimps [eq_nat_number_of];
   247 
   239 
   249 
   241 
   250 (*"neg" is used in rewrite rules for binary comparisons*)
   242 (*"neg" is used in rewrite rules for binary comparisons*)
   251 Goal "((number_of v :: nat) < number_of v') = \
   243 Goal "((number_of v :: nat) < number_of v') = \
   252 \        (if neg (number_of v) then neg (number_of (bin_minus v')) \
   244 \        (if neg (number_of v) then neg (number_of (bin_minus v')) \
   253 \         else neg (number_of (bin_add v (bin_minus v'))))";
   245 \         else neg (number_of (bin_add v (bin_minus v'))))";
   254 by (simp_tac
   246 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   255     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   247                           nat_less_eq_zless, less_number_of_eq_neg, nat_0]) 1);
   256 				  nat_less_eq_zless, less_number_of_eq_neg,
   248 by (simp_tac (ss_Int addsimps [neg_eq_less_0, zminus_zless, 
   257 				  nat_0]) 1);
       
   258 by (simp_tac (simpset_of Int.thy addsimps [neg_eq_less_0, zminus_zless, 
       
   259 				number_of_minus, zless_nat_eq_int_zless]) 1);
   249 				number_of_minus, zless_nat_eq_int_zless]) 1);
   260 qed "less_nat_number_of";
   250 qed "less_nat_number_of";
   261 
   251 
   262 Addsimps [less_nat_number_of];
   252 Addsimps [less_nat_number_of];
   263 
   253 
   350 (*** Comparisons involving Suc ***)
   340 (*** Comparisons involving Suc ***)
   351 
   341 
   352 Goal "(number_of v = Suc n) = \
   342 Goal "(number_of v = Suc n) = \
   353 \       (let pv = number_of (bin_pred v) in \
   343 \       (let pv = number_of (bin_pred v) in \
   354 \        if neg pv then False else nat pv = n)";
   344 \        if neg pv then False else nat pv = n)";
   355 by (simp_tac
   345 by (simp_tac (ss_Int addsimps
   356     (simpset_of Int.thy addsimps
   346 	      [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred,
   357       [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred,
   347 	       nat_number_of_def, zadd_0] @ zadd_ac) 1);
   358        nat_number_of_def, zadd_0] @ zadd_ac) 1);
       
   359 by (res_inst_tac [("x", "number_of v")] spec 1);
   348 by (res_inst_tac [("x", "number_of v")] spec 1);
   360 by (auto_tac (claset(), simpset() addsimps [nat_eq_iff]));
   349 by (auto_tac (claset(), simpset() addsimps [nat_eq_iff]));
   361 qed "eq_number_of_Suc";
   350 qed "eq_number_of_Suc";
   362 
   351 
   363 Goal "(Suc n = number_of v) = \
   352 Goal "(Suc n = number_of v) = \
   367 qed "Suc_eq_number_of";
   356 qed "Suc_eq_number_of";
   368 
   357 
   369 Goal "(number_of v < Suc n) = \
   358 Goal "(number_of v < Suc n) = \
   370 \       (let pv = number_of (bin_pred v) in \
   359 \       (let pv = number_of (bin_pred v) in \
   371 \        if neg pv then True else nat pv < n)";
   360 \        if neg pv then True else nat pv < n)";
   372 by (simp_tac
   361 by (simp_tac (ss_Int addsimps
   373     (simpset_of Int.thy addsimps
   362 	      [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred,
   374       [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred,
   363 	       nat_number_of_def, zadd_0] @ zadd_ac) 1);
   375        nat_number_of_def, zadd_0] @ zadd_ac) 1);
       
   376 by (res_inst_tac [("x", "number_of v")] spec 1);
   364 by (res_inst_tac [("x", "number_of v")] spec 1);
   377 by (auto_tac (claset(), simpset() addsimps [nat_less_iff]));
   365 by (auto_tac (claset(), simpset() addsimps [nat_less_iff]));
   378 qed "less_number_of_Suc";
   366 qed "less_number_of_Suc";
   379 
   367 
   380 Goal "(Suc n < number_of v) = \
   368 Goal "(Suc n < number_of v) = \
   381 \       (let pv = number_of (bin_pred v) in \
   369 \       (let pv = number_of (bin_pred v) in \
   382 \        if neg pv then False else n < nat pv)";
   370 \        if neg pv then False else n < nat pv)";
   383 by (simp_tac
   371 by (simp_tac (ss_Int addsimps
   384     (simpset_of Int.thy addsimps
   372 	      [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred,
   385       [Let_def, neg_eq_less_0, linorder_not_less, number_of_pred,
   373 	       nat_number_of_def, zadd_0] @ zadd_ac) 1);
   386        nat_number_of_def, zadd_0] @ zadd_ac) 1);
       
   387 by (res_inst_tac [("x", "number_of v")] spec 1);
   374 by (res_inst_tac [("x", "number_of v")] spec 1);
   388 by (auto_tac (claset(), simpset() addsimps [zless_nat_eq_int_zless]));
   375 by (auto_tac (claset(), simpset() addsimps [zless_nat_eq_int_zless]));
   389 qed "less_Suc_number_of";
   376 qed "less_Suc_number_of";
   390 
   377 
   391 Goal "(number_of v <= Suc n) = \
   378 Goal "(number_of v <= Suc n) = \
   421 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); 
   408 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); 
   422 val lemma2 = result();
   409 val lemma2 = result();
   423 
   410 
   424 Goal "((number_of (v BIT x) ::int) = number_of (w BIT y)) = \
   411 Goal "((number_of (v BIT x) ::int) = number_of (w BIT y)) = \
   425 \     (x=y & (((number_of v) ::int) = number_of w))"; 
   412 \     (x=y & (((number_of v) ::int) = number_of w))"; 
   426 by (simp_tac (simpset_of Int.thy addsimps
   413 by (simp_tac (ss_Int addsimps [number_of_BIT, lemma1, lemma2, eq_commute]) 1); 
   427 	       [number_of_BIT, lemma1, lemma2, eq_commute]) 1); 
       
   428 qed "eq_number_of_BIT_BIT"; 
   414 qed "eq_number_of_BIT_BIT"; 
   429 
   415 
   430 Goal "((number_of (v BIT x) ::int) = number_of bin.Pls) = \
   416 Goal "((number_of (v BIT x) ::int) = number_of bin.Pls) = \
   431 \     (x=False & (((number_of v) ::int) = number_of bin.Pls))"; 
   417 \     (x=False & (((number_of v) ::int) = number_of bin.Pls))"; 
   432 by (simp_tac (simpset_of Int.thy addsimps
   418 by (simp_tac (ss_Int addsimps [number_of_BIT, number_of_Pls, eq_commute]) 1); 
   433 	       [number_of_BIT, number_of_Pls, eq_commute]) 1); 
       
   434 by (res_inst_tac [("x", "number_of v")] spec 1);
   419 by (res_inst_tac [("x", "number_of v")] spec 1);
   435 by Safe_tac;
   420 by Safe_tac;
   436 by (ALLGOALS Full_simp_tac);
   421 by (ALLGOALS Full_simp_tac);
   437 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1);
   422 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1);
   438 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); 
   423 by (full_simp_tac (simpset() addsimps [zmod_zadd1_eq]) 1); 
   439 qed "eq_number_of_BIT_Pls"; 
   424 qed "eq_number_of_BIT_Pls"; 
   440 
   425 
   441 Goal "((number_of (v BIT x) ::int) = number_of bin.Min) = \
   426 Goal "((number_of (v BIT x) ::int) = number_of bin.Min) = \
   442 \     (x=True & (((number_of v) ::int) = number_of bin.Min))"; 
   427 \     (x=True & (((number_of v) ::int) = number_of bin.Min))"; 
   443 by (simp_tac (simpset_of Int.thy addsimps
   428 by (simp_tac (ss_Int addsimps [number_of_BIT, number_of_Min, eq_commute]) 1); 
   444 	       [number_of_BIT, number_of_Min, eq_commute]) 1); 
       
   445 by (res_inst_tac [("x", "number_of v")] spec 1);
   429 by (res_inst_tac [("x", "number_of v")] spec 1);
   446 by Auto_tac;
   430 by Auto_tac;
   447 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1);
   431 by (dres_inst_tac [("f", "%x. x mod 2")] arg_cong 1);
   448 by Auto_tac;
   432 by Auto_tac;
   449 qed "eq_number_of_BIT_Min"; 
   433 qed "eq_number_of_BIT_Min"; 
   466 by (ALLGOALS (asm_simp_tac (simpset() addsimps [nat_mult_distrib])));
   450 by (ALLGOALS (asm_simp_tac (simpset() addsimps [nat_mult_distrib])));
   467 qed "nat_power_eq";
   451 qed "nat_power_eq";
   468 
   452 
   469 Goal "(number_of v :: nat) ^ n = \
   453 Goal "(number_of v :: nat) ^ n = \
   470 \      (if neg (number_of v) then 0^n else nat ((number_of v :: int) ^ n))";
   454 \      (if neg (number_of v) then 0^n else nat ((number_of v :: int) ^ n))";
   471 by (simp_tac
   455 by (simp_tac (ss_Int addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
   472     (simpset_of Int.thy addsimps [neg_nat, not_neg_eq_ge_0, nat_number_of_def, 
       
   473 				  nat_power_eq]) 1);
   456 				  nat_power_eq]) 1);
   474 qed "power_nat_number_of";
   457 qed "power_nat_number_of";
   475 
   458 
   476 Addsimps [inst "n" "number_of ?w" power_nat_number_of];
   459 Addsimps [inst "n" "number_of ?w" power_nat_number_of];
   477 
   460 
   491 by (simp_tac (simpset() addsimps [zpower_even, zpower_zadd_distrib]) 1); 
   474 by (simp_tac (simpset() addsimps [zpower_even, zpower_zadd_distrib]) 1); 
   492 qed "zpower_odd";
   475 qed "zpower_odd";
   493 
   476 
   494 Goal "(z::int) ^ number_of (w BIT False) = \
   477 Goal "(z::int) ^ number_of (w BIT False) = \
   495 \     (let w = z ^ (number_of w) in  w*w)";
   478 \     (let w = z ^ (number_of w) in  w*w)";
   496 by (simp_tac (simpset_of Int.thy addsimps [nat_number_of_def,
   479 by (simp_tac (ss_Int addsimps [nat_number_of_def, number_of_BIT, Let_def]) 1);
   497         number_of_BIT, Let_def]) 1);
       
   498 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); 
   480 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); 
   499 by (case_tac "(0::int) <= x" 1);
   481 by (case_tac "(0::int) <= x" 1);
   500 by (auto_tac (claset(), 
   482 by (auto_tac (claset(), 
   501      simpset() addsimps [nat_mult_distrib, zpower_even, zpower_two])); 
   483      simpset() addsimps [nat_mult_distrib, zpower_even, zpower_two])); 
   502 qed "zpower_number_of_even";
   484 qed "zpower_number_of_even";
   503 
   485 
   504 Goal "(z::int) ^ number_of (w BIT True) = \
   486 Goal "(z::int) ^ number_of (w BIT True) = \
   505 \         (if (0::int) <= number_of w                   \
   487 \         (if (0::int) <= number_of w                   \
   506 \          then (let w = z ^ (number_of w) in  z*w*w)   \
   488 \          then (let w = z ^ (number_of w) in  z*w*w)   \
   507 \          else 1)";
   489 \          else 1)";
   508 by (simp_tac (simpset_of Int.thy addsimps [nat_number_of_def,
   490 by (simp_tac (ss_Int addsimps [nat_number_of_def, number_of_BIT, Let_def]) 1);
   509         number_of_BIT, Let_def]) 1);
       
   510 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); 
   491 by (res_inst_tac [("x","number_of w")] spec 1 THEN Clarify_tac 1); 
   511 by (case_tac "(0::int) <= x" 1);
   492 by (case_tac "(0::int) <= x" 1);
   512 by (auto_tac (claset(), 
   493 by (auto_tac (claset(), 
   513               simpset() addsimps [nat_add_distrib, nat_mult_distrib, 
   494               simpset() addsimps [nat_add_distrib, nat_mult_distrib, 
   514                                   zpower_even, zpower_two])); 
   495                                   zpower_even, zpower_two]));