src/HOL/Computational_Algebra/Formal_Power_Series.thy
changeset 66806 a4e82b58d833
parent 66804 3f9bb52082c4
child 66817 0b12755ccbb2
equal deleted inserted replaced
66805:274b4edca859 66806:a4e82b58d833
  1179     by (simp add: fps_divide_def Let_def ac_simps)
  1179     by (simp add: fps_divide_def Let_def ac_simps)
  1180 qed (auto simp add: fps_divide_def Let_def)
  1180 qed (auto simp add: fps_divide_def Let_def)
  1181 
  1181 
  1182 end
  1182 end
  1183 
  1183 
  1184 instantiation fps :: (field) ring_div
  1184 instantiation fps :: (field) idom_modulo
  1185 begin
  1185 begin
  1186 
  1186 
  1187 definition fps_mod_def:
  1187 definition fps_mod_def:
  1188   "f mod g = (if g = 0 then f else
  1188   "f mod g = (if g = 0 then f else
  1189      let n = subdegree g; h = fps_shift n g
  1189      let n = subdegree g; h = fps_shift n g
  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