Exact expanded PA statement
forall m n a b. ~(m = 0) -> ~(n = 0) -> (forall d. (exists u. m = d * u) -> (exists v. n = d * v) -> d = 1) -> exists x. (exists u v. x + m * u = a + m * v) /\ (exists r s. x + n * r = b + n * s)Structural proof guide
Constructive binary CRT for positive coprime natural moduli using balanced congruence.
Direct prerequisites: nonzero_is_succ, coprime_balanced_bezout, bezout_mod_left, bezout_mod_right, mod_eq_mul_left, mul_add, mul_one, dvd_to_mod_zero, mul_assoc, mul_comm, mod_eq_add, mod_eq_refl, mod_eq_trans, mod_eq_predecessor_cancel, zero_add. The authored body proceeds by case analysis (6), intermediate claims (35), equality transport (11).
Proof neighborhood
Direct dependencies
BT000R nonzero_is_succ BT0038 coprime_balanced_bezout BT004C bezout_mod_left BT004D bezout_mod_right BT003T mod_eq_mul_left BT0007 mul_add BT000A mul_one BT0046 dvd_to_mod_zero BT0008 mul_assoc BT0006 mul_comm BT003R mod_eq_add BT003O mod_eq_refl BT003Q mod_eq_trans BT004E mod_eq_predecessor_cancel BT0000 zero_addDirect dependents
Formal native tactic body
Dependencies are hypotheses of this body receipt. The focused endpoint audits separately check the complete empty-context certificates.
- 0001
intro m - 0002
intro n - 0003
intro a - 0004
intro b - 0005
intro hm - 0006
intro hn - 0007
intro hcop - 0008
have hms : exists k. m = S k - 0009
specialize nonzero_is_succ m - 0010
apply nonzero_is_succ - 0011
exact hm - 0012
have hns : exists k. n = S k - 0013
specialize nonzero_is_succ n - 0014
apply nonzero_is_succ - 0015
exact hn - 0016
have hbez : exists xp yp xn yn. m * xp + n * yp = 1 + (m * xn + n * yn) - 0017
specialize coprime_balanced_bezout m - 0018
specialize coprime_balanced_bezout n - 0019
apply coprime_balanced_bezout - 0020
exact hcop - 0021
cases hms - 0022
cases hns - 0023
cases hbez - 0024
cases hbez_witness - 0025
cases hbez_witness_witness - 0026
cases hbez_witness_witness_witness - 0027
have hbl : exists u v. n * x3 + m * u = (1 + n * x5) + m * v - 0028
specialize bezout_mod_left m - 0029
specialize bezout_mod_left n - 0030
specialize bezout_mod_left x2 - 0031
specialize bezout_mod_left x3 - 0032
specialize bezout_mod_left x4 - 0033
specialize bezout_mod_left x5 - 0034
apply bezout_mod_left - 0035
exact hbez_witness_witness_witness_witness - 0036
have hbr : exists u v. m * x2 + n * u = (1 + m * x4) + n * v - 0037
specialize bezout_mod_right m - 0038
specialize bezout_mod_right n - 0039
specialize bezout_mod_right x2 - 0040
specialize bezout_mod_right x3 - 0041
specialize bezout_mod_right x4 - 0042
specialize bezout_mod_right x5 - 0043
apply bezout_mod_right - 0044
exact hbez_witness_witness_witness_witness - 0045
have hal0 : exists u v. (a * (n * x3)) + m * u = (a * (1 + n * x5)) + m * v - 0046
specialize mod_eq_mul_left m - 0047
specialize mod_eq_mul_left (n * x3) - 0048
specialize mod_eq_mul_left (1 + n * x5) - 0049
specialize mod_eq_mul_left a - 0050
apply mod_eq_mul_left - 0051
exact hbl - 0052
have hal : exists u v. (a * (n * x3)) + m * u = (a + a * (n * x5)) + m * v - 0053
have haexpand : a * (1 + n * x5) = a + a * (n * x5) - 0054
trans a * 1 + a * (n * x5) - 0055
apply mul_add - 0056
congr - 0057
apply mul_one - 0058
refl - 0059
rewrite <- haexpand - 0060
exact hal0 - 0061
have hbm : exists u v. (b * (m * x2)) + m * u = 0 + m * v - 0062
apply dvd_to_mod_zero - 0063
exists b * x2 - 0064
trans (b * m) * x2 - 0065
symm - 0066
apply mul_assoc - 0067
trans (m * b) * x2 - 0068
congr - 0069
apply mul_comm - 0070
refl - 0071
apply mul_assoc - 0072
have hym : exists u v. ((a * (n * x3)) + (b * (m * x2))) + m * u = ((a + a * (n * x5)) + 0) + m * v - 0073
specialize mod_eq_add m - 0074
specialize mod_eq_add (a * (n * x3)) - 0075
specialize mod_eq_add (a + a * (n * x5)) - 0076
specialize mod_eq_add (b * (m * x2)) - 0077
specialize mod_eq_add 0 - 0078
apply mod_eq_add - 0079
exact hal - 0080
exact hbm - 0081
have hym_norm : exists u v. ((a * (n * x3)) + (b * (m * x2))) + m * u = (a + a * (n * x5)) + m * v - 0082
have hym_zero : (a + a * (n * x5)) + 0 = a + a * (n * x5) - 0083
rewrite PA3 - 0084
refl - 0085
rewrite <- hym_zero - 0086
exact hym - 0087
have hkm : exists u v. (x * (a * (n * x5))) + m * u = (x * (a * (n * x5))) + m * v - 0088
specialize mod_eq_refl m - 0089
specialize mod_eq_refl (x * (a * (n * x5))) - 0090
apply mod_eq_refl - 0091
have hymk : exists u v. (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + m * u = ((a + a * (n * x5)) + (x * (a * (n * x5)))) + m * v - 0092
specialize mod_eq_add m - 0093
specialize mod_eq_add ((a * (n * x3)) + (b * (m * x2))) - 0094
specialize mod_eq_add (a + a * (n * x5)) - 0095
specialize mod_eq_add (x * (a * (n * x5))) - 0096
specialize mod_eq_add (x * (a * (n * x5))) - 0097
apply mod_eq_add - 0098
exact hym_norm - 0099
exact hkm - 0100
have hcancelm : exists u v. ((a + a * (n * x5)) + x * (a * (n * x5))) + S x * u = a + S x * v - 0101
specialize mod_eq_predecessor_cancel x - 0102
specialize mod_eq_predecessor_cancel a - 0103
specialize mod_eq_predecessor_cancel (a * (n * x5)) - 0104
apply mod_eq_predecessor_cancel - 0105
rewrite <- hms_witness at hcancelm - 0106
rewrite <- hms_witness at hcancelm - 0107
have hbasem : exists u v. (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + m * u = a + m * v - 0108
specialize mod_eq_trans m - 0109
specialize mod_eq_trans (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) - 0110
specialize mod_eq_trans ((a + a * (n * x5)) + (x * (a * (n * x5)))) - 0111
specialize mod_eq_trans a - 0112
apply mod_eq_trans - 0113
exact hymk - 0114
exact hcancelm - 0115
have hknznm : exists u v. (x1 * (b * (m * x4))) + m * u = 0 + m * v - 0116
apply dvd_to_mod_zero - 0117
exists x1 * (b * x4) - 0118
trans x1 * ((b * m) * x4) - 0119
congr - 0120
refl - 0121
symm - 0122
apply mul_assoc - 0123
trans x1 * ((m * b) * x4) - 0124
congr - 0125
refl - 0126
congr - 0127
apply mul_comm - 0128
refl - 0129
trans x1 * (m * (b * x4)) - 0130
congr - 0131
refl - 0132
apply mul_assoc - 0133
trans (x1 * m) * (b * x4) - 0134
symm - 0135
apply mul_assoc - 0136
trans (m * x1) * (b * x4) - 0137
congr - 0138
apply mul_comm - 0139
refl - 0140
apply mul_assoc - 0141
have hfinalm0 : exists u v. ((((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4)))) + m * u = (a + 0) + m * v - 0142
specialize mod_eq_add m - 0143
specialize mod_eq_add (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) - 0144
specialize mod_eq_add a - 0145
specialize mod_eq_add (x1 * (b * (m * x4))) - 0146
specialize mod_eq_add 0 - 0147
apply mod_eq_add - 0148
exact hbasem - 0149
exact hknznm - 0150
have hazerom : exists u v. (a + 0) + m * u = a + m * v - 0151
exists 0 - 0152
exists 0 - 0153
simp - 0154
have hfinalm : exists u v. ((((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4)))) + m * u = a + m * v - 0155
specialize mod_eq_trans m - 0156
specialize mod_eq_trans ((((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4)))) - 0157
specialize mod_eq_trans (a + 0) - 0158
specialize mod_eq_trans a - 0159
apply mod_eq_trans - 0160
exact hfinalm0 - 0161
exact hazerom - 0162
have hbn0 : exists u v. (b * (m * x2)) + n * u = (b * (1 + m * x4)) + n * v - 0163
specialize mod_eq_mul_left n - 0164
specialize mod_eq_mul_left (m * x2) - 0165
specialize mod_eq_mul_left (1 + m * x4) - 0166
specialize mod_eq_mul_left b - 0167
apply mod_eq_mul_left - 0168
exact hbr - 0169
have hbn : exists u v. (b * (m * x2)) + n * u = (b + b * (m * x4)) + n * v - 0170
have hbexpand : b * (1 + m * x4) = b + b * (m * x4) - 0171
trans b * 1 + b * (m * x4) - 0172
apply mul_add - 0173
congr - 0174
apply mul_one - 0175
refl - 0176
rewrite <- hbexpand - 0177
exact hbn0 - 0178
have han : exists u v. (a * (n * x3)) + n * u = 0 + n * v - 0179
apply dvd_to_mod_zero - 0180
exists a * x3 - 0181
trans (a * n) * x3 - 0182
symm - 0183
apply mul_assoc - 0184
trans (n * a) * x3 - 0185
congr - 0186
apply mul_comm - 0187
refl - 0188
apply mul_assoc - 0189
have hyn0 : exists u v. ((a * (n * x3)) + (b * (m * x2))) + n * u = (0 + (b + b * (m * x4))) + n * v - 0190
specialize mod_eq_add n - 0191
specialize mod_eq_add (a * (n * x3)) - 0192
specialize mod_eq_add 0 - 0193
specialize mod_eq_add (b * (m * x2)) - 0194
specialize mod_eq_add (b + b * (m * x4)) - 0195
apply mod_eq_add - 0196
exact han - 0197
exact hbn - 0198
have hyn_norm : exists u v. ((a * (n * x3)) + (b * (m * x2))) + n * u = (b + b * (m * x4)) + n * v - 0199
have hyn_zero : 0 + (b + b * (m * x4)) = b + b * (m * x4) - 0200
specialize zero_add (b + b * (m * x4)) - 0201
exact zero_add - 0202
rewrite <- hyn_zero - 0203
exact hyn0 - 0204
have hkmz : exists u v. (x * (a * (n * x5))) + n * u = 0 + n * v - 0205
apply dvd_to_mod_zero - 0206
exists x * (a * x5) - 0207
trans x * ((a * n) * x5) - 0208
congr - 0209
refl - 0210
symm - 0211
apply mul_assoc - 0212
trans x * ((n * a) * x5) - 0213
congr - 0214
refl - 0215
congr - 0216
apply mul_comm - 0217
refl - 0218
trans x * (n * (a * x5)) - 0219
congr - 0220
refl - 0221
apply mul_assoc - 0222
trans (x * n) * (a * x5) - 0223
symm - 0224
apply mul_assoc - 0225
trans (n * x) * (a * x5) - 0226
congr - 0227
apply mul_comm - 0228
refl - 0229
apply mul_assoc - 0230
have hyn1 : exists u v. (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + n * u = ((b + b * (m * x4)) + 0) + n * v - 0231
specialize mod_eq_add n - 0232
specialize mod_eq_add ((a * (n * x3)) + (b * (m * x2))) - 0233
specialize mod_eq_add (b + b * (m * x4)) - 0234
specialize mod_eq_add (x * (a * (n * x5))) - 0235
specialize mod_eq_add 0 - 0236
apply mod_eq_add - 0237
exact hyn_norm - 0238
exact hkmz - 0239
have hyn1_norm : exists u v. (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + n * u = (b + b * (m * x4)) + n * v - 0240
have hyn1_zero : (b + b * (m * x4)) + 0 = b + b * (m * x4) - 0241
rewrite PA3 - 0242
refl - 0243
rewrite <- hyn1_zero - 0244
exact hyn1 - 0245
have hkn : exists u v. (x1 * (b * (m * x4))) + n * u = (x1 * (b * (m * x4))) + n * v - 0246
specialize mod_eq_refl n - 0247
specialize mod_eq_refl (x1 * (b * (m * x4))) - 0248
apply mod_eq_refl - 0249
have hynk : exists u v. ((((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4)))) + n * u = ((b + b * (m * x4)) + (x1 * (b * (m * x4)))) + n * v - 0250
specialize mod_eq_add n - 0251
specialize mod_eq_add (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) - 0252
specialize mod_eq_add (b + b * (m * x4)) - 0253
specialize mod_eq_add (x1 * (b * (m * x4))) - 0254
specialize mod_eq_add (x1 * (b * (m * x4))) - 0255
apply mod_eq_add - 0256
exact hyn1_norm - 0257
exact hkn - 0258
have hcanceln : exists u v. ((b + b * (m * x4)) + x1 * (b * (m * x4))) + S x1 * u = b + S x1 * v - 0259
specialize mod_eq_predecessor_cancel x1 - 0260
specialize mod_eq_predecessor_cancel b - 0261
specialize mod_eq_predecessor_cancel (b * (m * x4)) - 0262
apply mod_eq_predecessor_cancel - 0263
rewrite <- hns_witness at hcanceln - 0264
rewrite <- hns_witness at hcanceln - 0265
have hfinaln : exists u v. ((((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4)))) + n * u = b + n * v - 0266
specialize mod_eq_trans n - 0267
specialize mod_eq_trans ((((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4)))) - 0268
specialize mod_eq_trans ((b + b * (m * x4)) + (x1 * (b * (m * x4)))) - 0269
specialize mod_eq_trans b - 0270
apply mod_eq_trans - 0271
exact hynk - 0272
exact hcanceln - 0273
exists (((a * (n * x3)) + (b * (m * x2))) + (x * (a * (n * x5)))) + (x1 * (b * (m * x4))) - 0274
split - 0275
exact hfinalm - 0276
exact hfinaln