1221 from assms have [simp]: "subdegree g = 0" by (simp add: subdegree_eq_0_iff) |
1221 from assms have [simp]: "subdegree g = 0" by (simp add: subdegree_eq_0_iff) |
1222 from assms show "f div g = f * inverse g" |
1222 from assms show "f div g = f * inverse g" |
1223 by (auto simp: fps_divide_def Let_def subdegree_eq_0_iff) |
1223 by (auto simp: fps_divide_def Let_def subdegree_eq_0_iff) |
1224 from assms show "f mod g = 0" by (intro fps_mod_eq_zero) auto |
1224 from assms show "f mod g = 0" by (intro fps_mod_eq_zero) auto |
1225 qed |
1225 qed |
1226 |
|
1227 context |
|
1228 begin |
|
1229 private lemma fps_divide_cancel_aux1: |
|
1230 assumes "h$0 \<noteq> (0 :: 'a :: field)" |
|
1231 shows "(h * f) div (h * g) = f div g" |
|
1232 proof (cases "g = 0") |
|
1233 assume "g \<noteq> 0" |
|
1234 from assms have "h \<noteq> 0" by auto |
|
1235 note nz [simp] = \<open>g \<noteq> 0\<close> \<open>h \<noteq> 0\<close> |
|
1236 from assms have [simp]: "subdegree h = 0" by (simp add: subdegree_eq_0_iff) |
|
1237 |
|
1238 have "(h * f) div (h * g) = |
|
1239 fps_shift (subdegree g) (h * f * inverse (fps_shift (subdegree g) (h*g)))" |
|
1240 by (simp add: fps_divide_def Let_def) |
|
1241 also have "h * f * inverse (fps_shift (subdegree g) (h*g)) = |
|
1242 (inverse h * h) * f * inverse (fps_shift (subdegree g) g)" |
|
1243 by (subst fps_shift_mult) (simp_all add: algebra_simps fps_inverse_mult) |
|
1244 also from assms have "inverse h * h = 1" by (rule inverse_mult_eq_1) |
|
1245 finally show "(h * f) div (h * g) = f div g" by (simp_all add: fps_divide_def Let_def) |
|
1246 qed (simp_all add: fps_divide_def) |
|
1247 |
|
1248 private lemma fps_divide_cancel_aux2: |
|
1249 "(f * fps_X^m) div (g * fps_X^m) = f div (g :: 'a :: field fps)" |
|
1250 proof (cases "g = 0") |
|
1251 assume [simp]: "g \<noteq> 0" |
|
1252 have "(f * fps_X^m) div (g * fps_X^m) = |
|
1253 fps_shift (subdegree g + m) (f*inverse (fps_shift (subdegree g + m) (g*fps_X^m))*fps_X^m)" |
|
1254 by (simp add: fps_divide_def Let_def algebra_simps) |
|
1255 also have "... = f div g" |
|
1256 by (simp add: fps_shift_times_fps_X_power'' fps_divide_def Let_def) |
|
1257 finally show ?thesis . |
|
1258 qed (simp_all add: fps_divide_def) |
|
1259 |
1226 |
1260 instance proof |
1227 instance proof |
1261 fix f g :: "'a fps" |
1228 fix f g :: "'a fps" |
1262 define n where "n = subdegree g" |
1229 define n where "n = subdegree g" |
1263 define h where "h = fps_shift n g" |
1230 define h where "h = fps_shift n g" |
1282 by (subst fps_shift_cutoff) simp |
1249 by (subst fps_shift_cutoff) simp |
1283 also have "inverse h * h = 1" by (rule inverse_mult_eq_1) (simp add: h_def n_def) |
1250 also have "inverse h * h = 1" by (rule inverse_mult_eq_1) (simp add: h_def n_def) |
1284 finally show ?thesis by simp |
1251 finally show ?thesis by simp |
1285 qed |
1252 qed |
1286 qed (auto simp: fps_mod_def fps_divide_def Let_def) |
1253 qed (auto simp: fps_mod_def fps_divide_def Let_def) |
1287 next |
1254 qed |
1288 |
1255 |
1289 fix f g h :: "'a fps" |
|
1290 assume "h \<noteq> 0" |
|
1291 show "(h * f) div (h * g) = f div g" |
|
1292 proof - |
|
1293 define m where "m = subdegree h" |
|
1294 define h' where "h' = fps_shift m h" |
|
1295 have h_decomp: "h = h' * fps_X ^ m" unfolding h'_def m_def by (rule subdegree_decompose) |
|
1296 from \<open>h \<noteq> 0\<close> have [simp]: "h'$0 \<noteq> 0" by (simp add: h'_def m_def) |
|
1297 have "(h * f) div (h * g) = (h' * f * fps_X^m) div (h' * g * fps_X^m)" |
|
1298 by (simp add: h_decomp algebra_simps) |
|
1299 also have "... = f div g" by (simp add: fps_divide_cancel_aux1 fps_divide_cancel_aux2) |
|
1300 finally show ?thesis . |
|
1301 qed |
|
1302 |
|
1303 next |
|
1304 fix f g h :: "'a fps" |
|
1305 assume [simp]: "h \<noteq> 0" |
|
1306 define n h' where dfs: "n = subdegree h" "h' = fps_shift n h" |
|
1307 have "(f + g * h) div h = fps_shift n (f * inverse h') + fps_shift n (g * (h * inverse h'))" |
|
1308 by (simp add: fps_divide_def Let_def dfs[symmetric] algebra_simps fps_shift_add) |
|
1309 also have "h * inverse h' = (inverse h' * h') * fps_X^n" |
|
1310 by (subst subdegree_decompose) (simp_all add: dfs) |
|
1311 also have "... = fps_X^n" by (subst inverse_mult_eq_1) (simp_all add: dfs) |
|
1312 also have "fps_shift n (g * fps_X^n) = g" by simp |
|
1313 also have "fps_shift n (f * inverse h') = f div h" |
|
1314 by (simp add: fps_divide_def Let_def dfs) |
|
1315 finally show "(f + g * h) div h = g + f div h" by simp |
|
1316 qed |
|
1317 |
|
1318 end |
|
1319 end |
1256 end |
1320 |
1257 |
1321 lemma subdegree_mod: |
1258 lemma subdegree_mod: |
1322 assumes "f \<noteq> 0" "subdegree f < subdegree g" |
1259 assumes "f \<noteq> 0" "subdegree f < subdegree g" |
1323 shows "subdegree (f mod g) = subdegree f" |
1260 shows "subdegree (f mod g) = subdegree f" |
1409 begin |
1346 begin |
1410 |
1347 |
1411 definition fps_euclidean_size_def: |
1348 definition fps_euclidean_size_def: |
1412 "euclidean_size f = (if f = 0 then 0 else 2 ^ subdegree f)" |
1349 "euclidean_size f = (if f = 0 then 0 else 2 ^ subdegree f)" |
1413 |
1350 |
|
1351 context |
|
1352 begin |
|
1353 |
|
1354 private lemma fps_divide_cancel_aux1: |
|
1355 assumes "h$0 \<noteq> (0 :: 'a :: field)" |
|
1356 shows "(h * f) div (h * g) = f div g" |
|
1357 proof (cases "g = 0") |
|
1358 assume "g \<noteq> 0" |
|
1359 from assms have "h \<noteq> 0" by auto |
|
1360 note nz [simp] = \<open>g \<noteq> 0\<close> \<open>h \<noteq> 0\<close> |
|
1361 from assms have [simp]: "subdegree h = 0" by (simp add: subdegree_eq_0_iff) |
|
1362 |
|
1363 have "(h * f) div (h * g) = |
|
1364 fps_shift (subdegree g) (h * f * inverse (fps_shift (subdegree g) (h*g)))" |
|
1365 by (simp add: fps_divide_def Let_def) |
|
1366 also have "h * f * inverse (fps_shift (subdegree g) (h*g)) = |
|
1367 (inverse h * h) * f * inverse (fps_shift (subdegree g) g)" |
|
1368 by (subst fps_shift_mult) (simp_all add: algebra_simps fps_inverse_mult) |
|
1369 also from assms have "inverse h * h = 1" by (rule inverse_mult_eq_1) |
|
1370 finally show "(h * f) div (h * g) = f div g" by (simp_all add: fps_divide_def Let_def) |
|
1371 qed (simp_all add: fps_divide_def) |
|
1372 |
|
1373 private lemma fps_divide_cancel_aux2: |
|
1374 "(f * fps_X^m) div (g * fps_X^m) = f div (g :: 'a :: field fps)" |
|
1375 proof (cases "g = 0") |
|
1376 assume [simp]: "g \<noteq> 0" |
|
1377 have "(f * fps_X^m) div (g * fps_X^m) = |
|
1378 fps_shift (subdegree g + m) (f*inverse (fps_shift (subdegree g + m) (g*fps_X^m))*fps_X^m)" |
|
1379 by (simp add: fps_divide_def Let_def algebra_simps) |
|
1380 also have "... = f div g" |
|
1381 by (simp add: fps_shift_times_fps_X_power'' fps_divide_def Let_def) |
|
1382 finally show ?thesis . |
|
1383 qed (simp_all add: fps_divide_def) |
|
1384 |
1414 instance proof |
1385 instance proof |
1415 fix f g :: "'a fps" assume [simp]: "g \<noteq> 0" |
1386 fix f g :: "'a fps" assume [simp]: "g \<noteq> 0" |
1416 show "euclidean_size f \<le> euclidean_size (f * g)" |
1387 show "euclidean_size f \<le> euclidean_size (f * g)" |
1417 by (cases "f = 0") (auto simp: fps_euclidean_size_def) |
1388 by (cases "f = 0") (auto simp: fps_euclidean_size_def) |
1418 show "euclidean_size (f mod g) < euclidean_size g" |
1389 show "euclidean_size (f mod g) < euclidean_size g" |
1419 apply (cases "f = 0", simp add: fps_euclidean_size_def) |
1390 apply (cases "f = 0", simp add: fps_euclidean_size_def) |
1420 apply (rule disjE[OF le_less_linear[of "subdegree g" "subdegree f"]]) |
1391 apply (rule disjE[OF le_less_linear[of "subdegree g" "subdegree f"]]) |
1421 apply (simp_all add: fps_mod_eq_zero fps_euclidean_size_def subdegree_mod) |
1392 apply (simp_all add: fps_mod_eq_zero fps_euclidean_size_def subdegree_mod) |
1422 done |
1393 done |
|
1394 show "(h * f) div (h * g) = f div g" if "h \<noteq> 0" |
|
1395 for f g h :: "'a fps" |
|
1396 proof - |
|
1397 define m where "m = subdegree h" |
|
1398 define h' where "h' = fps_shift m h" |
|
1399 have h_decomp: "h = h' * fps_X ^ m" unfolding h'_def m_def by (rule subdegree_decompose) |
|
1400 from \<open>h \<noteq> 0\<close> have [simp]: "h'$0 \<noteq> 0" by (simp add: h'_def m_def) |
|
1401 have "(h * f) div (h * g) = (h' * f * fps_X^m) div (h' * g * fps_X^m)" |
|
1402 by (simp add: h_decomp algebra_simps) |
|
1403 also have "... = f div g" |
|
1404 by (simp add: fps_divide_cancel_aux1 fps_divide_cancel_aux2) |
|
1405 finally show ?thesis . |
|
1406 qed |
|
1407 show "(f + g * h) div h = g + f div h" |
|
1408 if "h \<noteq> 0" for f g h :: "'a fps" |
|
1409 proof - |
|
1410 define n h' where dfs: "n = subdegree h" "h' = fps_shift n h" |
|
1411 have "(f + g * h) div h = fps_shift n (f * inverse h') + fps_shift n (g * (h * inverse h'))" |
|
1412 by (simp add: fps_divide_def Let_def dfs [symmetric] algebra_simps fps_shift_add that) |
|
1413 also have "h * inverse h' = (inverse h' * h') * fps_X^n" |
|
1414 by (subst subdegree_decompose) (simp_all add: dfs) |
|
1415 also have "... = fps_X^n" |
|
1416 by (subst inverse_mult_eq_1) (simp_all add: dfs that) |
|
1417 also have "fps_shift n (g * fps_X^n) = g" by simp |
|
1418 also have "fps_shift n (f * inverse h') = f div h" |
|
1419 by (simp add: fps_divide_def Let_def dfs) |
|
1420 finally show ?thesis by simp |
|
1421 qed |
1423 qed (simp_all add: fps_euclidean_size_def) |
1422 qed (simp_all add: fps_euclidean_size_def) |
|
1423 |
|
1424 end |
1424 |
1425 |
1425 end |
1426 end |
1426 |
1427 |
1427 instantiation fps :: (field) euclidean_ring_gcd |
1428 instantiation fps :: (field) euclidean_ring_gcd |
1428 begin |
1429 begin |