SL000Q · theorem body

quadratic_supplement_two_half_complete

Alpha v34 checked-use · independently kernel and Lean verified; not Stable

Complete constructive second supplementary law for an explicitly decomposed odd prime, with no unproved count-shape hypothesis.

Current library: Alpha v34, 4,223 checked-use theorems; Stable remains 432. Historical first admissions, original proof editions, and non-admitted aliases are preserved. Exact original first-admission records.

Statement with defined notation

∀ p. ∀ h. ∀ a. p = 2 · h + 1 → Prime(p) → a = 2 → (QRes(p,2) → (∃ x. p = 8 · x + 1) ∨ (∃ x. p = 8 · x + 7)) ∧ ((∃ x. p = 8 · x + 1) ∨ (∃ x. p = 8 · x + 7) → QRes(p,2)) ∧ ((¬QRes(p,2) → (∃ x. p = 8 · x + 3) ∨ (∃ x. p = 8 · x + 5)) ∧ ((∃ x. p = 8 · x + 3) ∨ (∃ x. p = 8 · x + 5) → ¬QRes(p,2)))

Every purple notation token opens its conservative definition. This reading surface never changes the unchanged intuitionistic kernel or confers checked-use authority.

Definitions used by this theorem

In the theorem statement

In local proof propositions

Exact expanded first-order statement
forall p h a. p = 2 * h + 1 -> ((~(p = 1) /\ forall frm_prime_left_qst_half_prime frm_prime_right_qst_half_prime. p = frm_prime_left_qst_half_prime * frm_prime_right_qst_half_prime -> frm_prime_left_qst_half_prime = 1 \/ frm_prime_right_qst_half_prime = 1)) -> a = 2 -> ((((((exists qst_root_two. exists qst_mod_left_two qst_mod_right_two. qst_root_two * qst_root_two + p * qst_mod_left_two = 2 + p * qst_mod_right_two) -> (((exists qst_mod_eight_modulus_one. p = 8 * qst_mod_eight_modulus_one + 1) \/ (exists qst_mod_eight_modulus_seven. p = 8 * qst_mod_eight_modulus_seven + 7)))) /\ ((((exists qst_mod_eight_modulus_one. p = 8 * qst_mod_eight_modulus_one + 1) \/ (exists qst_mod_eight_modulus_seven. p = 8 * qst_mod_eight_modulus_seven + 7))) -> (exists qst_root_two. exists qst_mod_left_two qst_mod_right_two. qst_root_two * qst_root_two + p * qst_mod_left_two = 2 + p * qst_mod_right_two)))) /\ ((((~(exists qst_root_two. exists qst_mod_left_two qst_mod_right_two. qst_root_two * qst_root_two + p * qst_mod_left_two = 2 + p * qst_mod_right_two)) -> (((exists qst_mod_eight_modulus_three. p = 8 * qst_mod_eight_modulus_three + 3) \/ (exists qst_mod_eight_modulus_five. p = 8 * qst_mod_eight_modulus_five + 5)))) /\ ((((exists qst_mod_eight_modulus_three. p = 8 * qst_mod_eight_modulus_three + 3) \/ (exists qst_mod_eight_modulus_five. p = 8 * qst_mod_eight_modulus_five + 5))) -> (~(exists qst_root_two. exists qst_mod_left_two qst_mod_right_two. qst_root_two * qst_root_two + p * qst_mod_left_two = 2 + p * qst_mod_right_two)))))))

Proof neighborhood

Direct theorem prerequisites

Direct theorem dependents

Definition-aware tactic body

Only propositions whose conservative expansion has been checked for exact first-order equivalence are compacted. Every changed line retains its immutable exact replay command.

Read the argument

Proof checkpoints

71 script commands · 15 reading checkpoints · 5 local claims

This is a reading aid, not a new proof or a proof-tree certificate. Checkpoint groups are consecutive commands, not inferred branch boundaries. Every step links to the preserved script.

Definition notation is shown below. Open the paired exact edition for the original native formulas. Source pairing is not a new equivalence certificate.

Named ingredients (4)
01Fix variables and assumptionsL1–6

Work with arbitrary variables or the premises of the current implication.

  1. L1
    intro p
  2. L2
    intro h
  3. L3
    intro a
  4. L4
    intro hpodd
  5. L5
    intro hprime
  6. L6
    intro hatwo
02Establish hpositiveL7–7

Establish this local claim before using it. It is not an additional assumption.

  1. L7
    have hpositive : Lt(0,a)Definitions: Lt(0,a)Original native command in the exact edition
03Construct an explicit witnessL8–8

Supply the displayed value, then prove that it has the required property.

  1. L8
    exists 1
04Calculate and transport equalitiesL9–10

Carry out the recorded arithmetic or equality steps; inspect the exact commands for their direction and premises.

  1. L9
    rewrite hatwo
  2. L10
    norm_num
05Establish hboundL11–17

Establish this local claim before using it. It is not an additional assumption. The following proof commands apply odd prime strictly exceeds two.

  1. L11
    have hbound : Lt(a,p)Definitions: Lt(a,p)Original native command in the exact edition
  2. L12
    rewrite hatwo
  3. L13
    specialize odd_prime_strictly_exceeds_two p
  4. L14
    specialize odd_prime_strictly_exceeds_two h
  5. L15
    apply odd_prime_strictly_exceeds_two
  6. L16
    exact hpodd
  7. L17
    exact hprime
06Establish hrangeL18–21

Establish this local claim before using it. It is not an additional assumption.

  1. L18
    have hrange : ∃ b. ∃ c. Range(b,c,1,h)Definitions: Range(b,c,1,h)Original native command in the exact edition
  2. L19
    specialize beta_range_exists 1
  3. L20
    specialize beta_range_exists h
  4. L21
    exact beta_range_exists
07Separate the logical casesL22–23

Follow the explicit conjunction, disjunction, witness, or contradiction step recorded below.

  1. L22
    cases hrange
  2. L23
    cases hrange_witness
08Establish hgaussL24–33

Establish this local claim before using it. It is not an additional assumption. The following proof commands apply bounded gauss lemma complete.

  1. L24
    have hgauss : ∃ e. (∃ y. ∃ z. ∃ n. ∃ m. (∀ k. Lt(k,h) → ∃ i. ∃ j. ∃ u. BetaAt(x,x1,k,i) ∧ (BetaAt(y,z,k,j) ∧ (BetaAt(n,m,k,u) ∧ (Lt(0,j) ∧ (Le(j,h) ∧ ((u = 0 ∨ u = 1) ∧ (u = 0 ∧ ModEq(p,a · i,j) ∨ u = 1 ∧ ModEq(p,a · i,2 · h · j)))))))) ∧ BitCount(n,m,h,e)) ∧ ((QRes(p,a) → Even(e)) ∧ (Even(e) → QRes(p,a)) ∧ ((¬QRes(p,a) → Odd(e)) ∧ (Odd(e) → ¬QRes(p,a))))Definitions: Lt(k,h)BetaAt(x,x1,k,i)BetaAt(y,z,k,j)BetaAt(n,m,k,u)Lt(0,j)Le(j,h)ModEq(p,a · i,j)ModEq(p,a · i,2 · h · j)BitCount(n,m,h,e)QRes(p,a)Even(e)Odd(e)Original native command in the exact edition
  2. L25
    specialize bounded_gauss_lemma_complete p
  3. L26
    specialize bounded_gauss_lemma_complete h
  4. L27
    specialize bounded_gauss_lemma_complete a
  5. L28
    specialize bounded_gauss_lemma_complete x
  6. L29
    specialize bounded_gauss_lemma_complete x1
  7. L30
    apply bounded_gauss_lemma_complete
  8. L31
    exact hpodd
  9. L32
    exact hprime
  10. L33
    exact hpositive
09Use earlier factsL34–35

Instantiate or apply named facts and discharge the corresponding proof obligations.

  1. L34
    exact hbound
  2. L35
    exact hrange_witness_witness
10Separate the logical casesL36–42

Follow the explicit conjunction, disjunction, witness, or contradiction step recorded below.

  1. L36
    cases hgauss
  2. L37
    cases hgauss_witness
  3. L38
    cases hgauss_witness_left
  4. L39
    cases hgauss_witness_left_witness
  5. L40
    cases hgauss_witness_left_witness_witness
  6. L41
    cases hgauss_witness_left_witness_witness_witness
  7. L42
    cases hgauss_witness_left_witness_witness_witness_witness
11Establish hshapeL43–52

Establish this local claim before using it. It is not an additional assumption.

  1. L43
    have hshape : (((h = 2 * x2) \/ (exists qst_count_half_qst_gauss_final_shape. h = 2 * qst_count_half_qst_gauss_final_shape + 1 /\ x2 = S qst_count_half_qst_gauss_final_shape)))
  2. L44
    specialize doubling_gauss_reflection_count_shape p
  3. L45
    specialize doubling_gauss_reflection_count_shape h
  4. L46
    specialize doubling_gauss_reflection_count_shape a
  5. L47
    specialize doubling_gauss_reflection_count_shape x
  6. L48
    specialize doubling_gauss_reflection_count_shape x1
  7. L49
    specialize doubling_gauss_reflection_count_shape x3
  8. L50
    specialize doubling_gauss_reflection_count_shape x4
  9. L51
    specialize doubling_gauss_reflection_count_shape x5
  10. L52
    specialize doubling_gauss_reflection_count_shape x6
12Use earlier factsL53–62

Instantiate or apply named facts and discharge the corresponding proof obligations.

  1. L53
    specialize doubling_gauss_reflection_count_shape x2
  2. L54
    apply doubling_gauss_reflection_count_shape
  3. L55
    exact hpodd
  4. L56
    exact hatwo
  5. L57
    exact hrange_witness_witness
  6. L58
    exact hgauss_witness_left_witness_witness_witness_witness_left
  7. L59
    exact hgauss_witness_left_witness_witness_witness_witness_right
  8. L60
    specialize quadratic_supplement_two_conditional_on_gauss_count_shape p
  9. L61
    specialize quadratic_supplement_two_conditional_on_gauss_count_shape h
  10. L62
    specialize quadratic_supplement_two_conditional_on_gauss_count_shape x2
13Use earlier factsL63–66

Instantiate or apply named facts and discharge the corresponding proof obligations.

  1. L63
    apply quadratic_supplement_two_conditional_on_gauss_count_shape
  2. L64
    exact hpodd
  3. L65
    exact hprime
  4. L66
    exact hshape
14Calculate and transport equalitiesL67–70

Carry out the recorded arithmetic or equality steps; inspect the exact commands for their direction and premises.

  1. L67
    rewrite hatwo at hgauss_witness_right
  2. L68
    rewrite hatwo at hgauss_witness_right
  3. L69
    rewrite hatwo at hgauss_witness_right
  4. L70
    rewrite hatwo at hgauss_witness_right
15Use earlier factsL71–71

Instantiate or apply named facts and discharge the corresponding proof obligations.

  1. L71
    exact hgauss_witness_right

Library-wide reading audit

Original defined command ledger · 71 lines
  1. 0001intro p
  2. 0002intro h
  3. 0003intro a
  4. 0004intro hpodd
  5. 0005intro hprime
  6. 0006intro hatwo
  7. 0007have hpositive : Lt(0,a)
    Exact native replay linehave hpositive : exists gap. gap + S 0 = a
  8. 0008exists 1
  9. 0009rewrite hatwo
  10. 0010norm_num
  11. 0011have hbound : Lt(a,p)
    Exact native replay linehave hbound : exists gap. gap + S a = p
  12. 0012rewrite hatwo
  13. 0013specialize odd_prime_strictly_exceeds_two p
  14. 0014specialize odd_prime_strictly_exceeds_two h
  15. 0015apply odd_prime_strictly_exceeds_two
  16. 0016exact hpodd
  17. 0017exact hprime
  18. 0018have hrange : ∃ b. ∃ c. Range(b,c,1,h)
    Exact native replay linehave hrange : exists b c. (forall gsp_range_index_qst_gauss_range. (exists gsp_lt_gap_qst_gauss_range_range_bound. gsp_lt_gap_qst_gauss_range_range_bound + S gsp_range_index_qst_gauss_range = h) -> (((exists gsp_beta_height_qst_gauss_range_range_entry. gsp_beta_height_qst_gauss_range_range_entry + S (1 + gsp_range_index_qst_gauss_range) = S ((S (gsp_range_index_qst_gauss_range)) * c)) /\ exists gsp_beta_quotient_qst_gauss_range_range_entry. b = gsp_beta_quotient_qst_gauss_range_range_entry * S ((S (gsp_range_index_qst_gauss_range)) * c) + (1 + gsp_range_index_qst_gauss_range))))
  19. 0019specialize beta_range_exists 1
  20. 0020specialize beta_range_exists h
  21. 0021exact beta_range_exists
  22. 0022cases hrange
  23. 0023cases hrange_witness
  24. 0024have hgauss : ∃ e. (∃ y. ∃ z. ∃ n. ∃ m. (∀ k. Lt(k,h) → ∃ i. ∃ j. ∃ u. BetaAt(x,x1,k,i) ∧ (BetaAt(y,z,k,j) ∧ (BetaAt(n,m,k,u) ∧ (Lt(0,j) ∧ (Le(j,h) ∧ ((u = 0 ∨ u = 1) ∧ (u = 0 ∧ ModEq(p,a · i,j) ∨ u = 1 ∧ ModEq(p,a · i,2 · h · j)))))))) ∧ BitCount(n,m,h,e)) ∧ ((QRes(p,a)Even(e)) ∧ (Even(e)QRes(p,a)) ∧ ((¬QRes(p,a)Odd(e)) ∧ (Odd(e) → ¬QRes(p,a))))
    Exact native replay linehave hgauss : exists e. ((exists mb mc sb sc. ((forall gsp_index_qst_gauss_signed. (exists gsp_lt_gap_qst_gauss_signed_index_bound. gsp_lt_gap_qst_gauss_signed_index_bound + S gsp_index_qst_gauss_signed = h) -> (exists gsp_value_qst_gauss_signed_entry gsp_magnitude_qst_gauss_signed_entry gsp_sign_qst_gauss_signed_entry. (((exists ff_h_gsp_qst_gauss_signed_entry_source. ff_h_gsp_qst_gauss_signed_entry_source + S (gsp_value_qst_gauss_signed_entry) = S ((S (gsp_index_qst_gauss_signed)) * x1)) /\ exists ff_q_gsp_qst_gauss_signed_entry_source. x = ff_q_gsp_qst_gauss_signed_entry_source * S ((S (gsp_index_qst_gauss_signed)) * x1) + (gsp_value_qst_gauss_signed_entry))) /\ ((((exists ff_h_gsp_qst_gauss_signed_entry_magnitude. ff_h_gsp_qst_gauss_signed_entry_magnitude + S (gsp_magnitude_qst_gauss_signed_entry) = S ((S (gsp_index_qst_gauss_signed)) * mc)) /\ exists ff_q_gsp_qst_gauss_signed_entry_magnitude. mb = ff_q_gsp_qst_gauss_signed_entry_magnitude * S ((S (gsp_index_qst_gauss_signed)) * mc) + (gsp_magnitude_qst_gauss_signed_entry))) /\ ((((exists ff_h_gsp_qst_gauss_signed_entry_sign. ff_h_gsp_qst_gauss_signed_entry_sign + S (gsp_sign_qst_gauss_signed_entry) = S ((S (gsp_index_qst_gauss_signed)) * sc)) /\ exists ff_q_gsp_qst_gauss_signed_entry_sign. sb = ff_q_gsp_qst_gauss_signed_entry_sign * S ((S (gsp_index_qst_gauss_signed)) * sc) + (gsp_sign_qst_gauss_signed_entry))) /\ ((exists gsp_lt_gap_qst_gauss_signed_entry_positive. gsp_lt_gap_qst_gauss_signed_entry_positive + S 0 = gsp_magnitude_qst_gauss_signed_entry) /\ ((exists gsp_le_gap_qst_gauss_signed_entry_bounded. gsp_le_gap_qst_gauss_signed_entry_bounded + gsp_magnitude_qst_gauss_signed_entry = h) /\ ((gsp_sign_qst_gauss_signed_entry = 0 \/ gsp_sign_qst_gauss_signed_entry = 1) /\ (((gsp_sign_qst_gauss_signed_entry = 0 /\ (exists gsp_mod_left_qst_gauss_signed_entry_lower gsp_mod_right_qst_gauss_signed_entry_lower. (a * gsp_value_qst_gauss_signed_entry) + p * gsp_mod_left_qst_gauss_signed_entry_lower = (gsp_magnitude_qst_gauss_signed_entry) + p * gsp_mod_right_qst_gauss_signed_entry_lower)) \/ (gsp_sign_qst_gauss_signed_entry = 1 /\ (exists gsp_mod_left_qst_gauss_signed_entry_reflected gsp_mod_right_qst_gauss_signed_entry_reflected. (a * gsp_value_qst_gauss_signed_entry) + p * gsp_mod_left_qst_gauss_signed_entry_reflected = ((2 * h) * gsp_magnitude_qst_gauss_signed_entry) + p * gsp_mod_right_qst_gauss_signed_entry_reflected))))))))))) /\ (((exists ff_u_qst_gauss_count_sum ff_v_qst_gauss_count_sum. ((((exists ff_h_qst_gauss_count_sum_start. ff_h_qst_gauss_count_sum_start + S (0) = S ((S (0)) * ff_v_qst_gauss_count_sum)) /\ exists ff_q_qst_gauss_count_sum_start. ff_u_qst_gauss_count_sum = ff_q_qst_gauss_count_sum_start * S ((S (0)) * ff_v_qst_gauss_count_sum) + (0))) /\ ((((exists ff_h_qst_gauss_count_sum_terminal. ff_h_qst_gauss_count_sum_terminal + S (e) = S ((S (h)) * ff_v_qst_gauss_count_sum)) /\ exists ff_q_qst_gauss_count_sum_terminal. ff_u_qst_gauss_count_sum = ff_q_qst_gauss_count_sum_terminal * S ((S (h)) * ff_v_qst_gauss_count_sum) + (e))) /\ forall ff_i_qst_gauss_count_sum. (exists ff_lt_qst_gauss_count_sum_bound. ff_lt_qst_gauss_count_sum_bound + S ff_i_qst_gauss_count_sum = h) -> exists ff_a_qst_gauss_count_sum ff_r_qst_gauss_count_sum ff_s_qst_gauss_count_sum. ((((exists ff_h_qst_gauss_count_sum_summand. ff_h_qst_gauss_count_sum_summand + S (ff_a_qst_gauss_count_sum) = S ((S (ff_i_qst_gauss_count_sum)) * sc)) /\ exists ff_q_qst_gauss_count_sum_summand. sb = ff_q_qst_gauss_count_sum_summand * S ((S (ff_i_qst_gauss_count_sum)) * sc) + (ff_a_qst_gauss_count_sum))) /\ ((((exists ff_h_qst_gauss_count_sum_partial. ff_h_qst_gauss_count_sum_partial + S (ff_r_qst_gauss_count_sum) = S ((S (ff_i_qst_gauss_count_sum)) * ff_v_qst_gauss_count_sum)) /\ exists ff_q_qst_gauss_count_sum_partial. ff_u_qst_gauss_count_sum = ff_q_qst_gauss_count_sum_partial * S ((S (ff_i_qst_gauss_count_sum)) * ff_v_qst_gauss_count_sum) + (ff_r_qst_gauss_count_sum))) /\ ((((exists ff_h_qst_gauss_count_sum_successor. ff_h_qst_gauss_count_sum_successor + S (ff_s_qst_gauss_count_sum) = S ((S (S ff_i_qst_gauss_count_sum)) * ff_v_qst_gauss_count_sum)) /\ exists ff_q_qst_gauss_count_sum_successor. ff_u_qst_gauss_count_sum = ff_q_qst_gauss_count_sum_successor * S ((S (S ff_i_qst_gauss_count_sum)) * ff_v_qst_gauss_count_sum) + (ff_s_qst_gauss_count_sum))) /\ ff_s_qst_gauss_count_sum = ff_r_qst_gauss_count_sum + ff_a_qst_gauss_count_sum)))))) /\ (forall ff_i_qst_gauss_count_bits. (exists ff_lt_qst_gauss_count_bits_bound. ff_lt_qst_gauss_count_bits_bound + S ff_i_qst_gauss_count_bits = h) -> exists ff_bit_qst_gauss_count_bits. ((((exists ff_h_qst_gauss_count_bits_decoded. ff_h_qst_gauss_count_bits_decoded + S (ff_bit_qst_gauss_count_bits) = S ((S (ff_i_qst_gauss_count_bits)) * sc)) /\ exists ff_q_qst_gauss_count_bits_decoded. sb = ff_q_qst_gauss_count_bits_decoded * S ((S (ff_i_qst_gauss_count_bits)) * sc) + (ff_bit_qst_gauss_count_bits))) /\ (ff_bit_qst_gauss_count_bits = 0 \/ ff_bit_qst_gauss_count_bits = 1))))))) /\ ((((((exists qr_x_qst_gauss_two. exists qr_u_qst_gauss_two qr_v_qst_gauss_two. qr_x_qst_gauss_two * qr_x_qst_gauss_two + p * qr_u_qst_gauss_two = a + p * qr_v_qst_gauss_two) -> (exists qst_even_count. e = 2 * qst_even_count)) /\ ((exists qst_even_count. e = 2 * qst_even_count) -> (exists qr_x_qst_gauss_two. exists qr_u_qst_gauss_two qr_v_qst_gauss_two. qr_x_qst_gauss_two * qr_x_qst_gauss_two + p * qr_u_qst_gauss_two = a + p * qr_v_qst_gauss_two)))) /\ ((((~(exists qr_x_qst_gauss_two. exists qr_u_qst_gauss_two qr_v_qst_gauss_two. qr_x_qst_gauss_two * qr_x_qst_gauss_two + p * qr_u_qst_gauss_two = a + p * qr_v_qst_gauss_two)) -> (exists qst_odd_count. e = 2 * qst_odd_count + 1)) /\ ((exists qst_odd_count. e = 2 * qst_odd_count + 1) -> (~(exists qr_x_qst_gauss_two. exists qr_u_qst_gauss_two qr_v_qst_gauss_two. qr_x_qst_gauss_two * qr_x_qst_gauss_two + p * qr_u_qst_gauss_two = a + p * qr_v_qst_gauss_two))))))))
  25. 0025specialize bounded_gauss_lemma_complete p
  26. 0026specialize bounded_gauss_lemma_complete h
  27. 0027specialize bounded_gauss_lemma_complete a
  28. 0028specialize bounded_gauss_lemma_complete x
  29. 0029specialize bounded_gauss_lemma_complete x1
  30. 0030apply bounded_gauss_lemma_complete
  31. 0031exact hpodd
  32. 0032exact hprime
  33. 0033exact hpositive
  34. 0034exact hbound
  35. 0035exact hrange_witness_witness
  36. 0036cases hgauss
  37. 0037cases hgauss_witness
  38. 0038cases hgauss_witness_left
  39. 0039cases hgauss_witness_left_witness
  40. 0040cases hgauss_witness_left_witness_witness
  41. 0041cases hgauss_witness_left_witness_witness_witness
  42. 0042cases hgauss_witness_left_witness_witness_witness_witness
  43. 0043have hshape : (((h = 2 * x2) \/ (exists qst_count_half_qst_gauss_final_shape. h = 2 * qst_count_half_qst_gauss_final_shape + 1 /\ x2 = S qst_count_half_qst_gauss_final_shape)))
  44. 0044specialize doubling_gauss_reflection_count_shape p
  45. 0045specialize doubling_gauss_reflection_count_shape h
  46. 0046specialize doubling_gauss_reflection_count_shape a
  47. 0047specialize doubling_gauss_reflection_count_shape x
  48. 0048specialize doubling_gauss_reflection_count_shape x1
  49. 0049specialize doubling_gauss_reflection_count_shape x3
  50. 0050specialize doubling_gauss_reflection_count_shape x4
  51. 0051specialize doubling_gauss_reflection_count_shape x5
  52. 0052specialize doubling_gauss_reflection_count_shape x6
  53. 0053specialize doubling_gauss_reflection_count_shape x2
  54. 0054apply doubling_gauss_reflection_count_shape
  55. 0055exact hpodd
  56. 0056exact hatwo
  57. 0057exact hrange_witness_witness
  58. 0058exact hgauss_witness_left_witness_witness_witness_witness_left
  59. 0059exact hgauss_witness_left_witness_witness_witness_witness_right
  60. 0060specialize quadratic_supplement_two_conditional_on_gauss_count_shape p
  61. 0061specialize quadratic_supplement_two_conditional_on_gauss_count_shape h
  62. 0062specialize quadratic_supplement_two_conditional_on_gauss_count_shape x2
  63. 0063apply quadratic_supplement_two_conditional_on_gauss_count_shape
  64. 0064exact hpodd
  65. 0065exact hprime
  66. 0066exact hshape
  67. 0067rewrite hatwo at hgauss_witness_right
  68. 0068rewrite hatwo at hgauss_witness_right
  69. 0069rewrite hatwo at hgauss_witness_right
  70. 0070rewrite hatwo at hgauss_witness_right
  71. 0071exact hgauss_witness_right