163 "subdegree f = (if f = 0 then 0 else LEAST n. f$n \<noteq> 0)" |
160 "subdegree f = (if f = 0 then 0 else LEAST n. f$n \<noteq> 0)" |
164 |
161 |
165 lemma subdegreeI: |
162 lemma subdegreeI: |
166 assumes "f $ d \<noteq> 0" and "\<And>i. i < d \<Longrightarrow> f $ i = 0" |
163 assumes "f $ d \<noteq> 0" and "\<And>i. i < d \<Longrightarrow> f $ i = 0" |
167 shows "subdegree f = d" |
164 shows "subdegree f = d" |
168 proof- |
165 by (smt (verit) LeastI_ex assms fps_zero_nth linorder_cases not_less_Least subdegree_def) |
169 from assms(1) have "f \<noteq> 0" by auto |
|
170 moreover from assms(1) have "(LEAST i. f $ i \<noteq> 0) = d" |
|
171 proof (rule Least_equality) |
|
172 fix e assume "f $ e \<noteq> 0" |
|
173 with assms(2) have "\<not>(e < d)" by blast |
|
174 thus "e \<ge> d" by simp |
|
175 qed |
|
176 ultimately show ?thesis unfolding subdegree_def by simp |
|
177 qed |
|
178 |
166 |
179 lemma nth_subdegree_nonzero [simp,intro]: "f \<noteq> 0 \<Longrightarrow> f $ subdegree f \<noteq> 0" |
167 lemma nth_subdegree_nonzero [simp,intro]: "f \<noteq> 0 \<Longrightarrow> f $ subdegree f \<noteq> 0" |
180 proof- |
168 using fps_nonzero_nth_minimal subdegreeI by blast |
181 assume "f \<noteq> 0" |
|
182 hence "subdegree f = (LEAST n. f $ n \<noteq> 0)" by (simp add: subdegree_def) |
|
183 also from \<open>f \<noteq> 0\<close> have "\<exists>n. f$n \<noteq> 0" using fps_nonzero_nth by blast |
|
184 from LeastI_ex[OF this] have "f $ (LEAST n. f $ n \<noteq> 0) \<noteq> 0" . |
|
185 finally show ?thesis . |
|
186 qed |
|
187 |
169 |
188 lemma nth_less_subdegree_zero [dest]: "n < subdegree f \<Longrightarrow> f $ n = 0" |
170 lemma nth_less_subdegree_zero [dest]: "n < subdegree f \<Longrightarrow> f $ n = 0" |
189 proof (cases "f = 0") |
171 by (metis fps_nonzero_nth_minimal fps_zero_nth subdegreeI) |
190 assume "f \<noteq> 0" and less: "n < subdegree f" |
|
191 note less |
|
192 also from \<open>f \<noteq> 0\<close> have "subdegree f = (LEAST n. f $ n \<noteq> 0)" by (simp add: subdegree_def) |
|
193 finally show "f $ n = 0" using not_less_Least by blast |
|
194 qed simp_all |
|
195 |
172 |
196 lemma subdegree_geI: |
173 lemma subdegree_geI: |
197 assumes "f \<noteq> 0" "\<And>i. i < n \<Longrightarrow> f$i = 0" |
174 assumes "f \<noteq> 0" "\<And>i. i < n \<Longrightarrow> f$i = 0" |
198 shows "subdegree f \<ge> n" |
175 shows "subdegree f \<ge> n" |
199 proof (rule ccontr) |
176 by (meson assms leI nth_subdegree_nonzero) |
200 assume "\<not>(subdegree f \<ge> n)" |
|
201 with assms(2) have "f $ subdegree f = 0" by simp |
|
202 moreover from assms(1) have "f $ subdegree f \<noteq> 0" by simp |
|
203 ultimately show False by contradiction |
|
204 qed |
|
205 |
177 |
206 lemma subdegree_greaterI: |
178 lemma subdegree_greaterI: |
207 assumes "f \<noteq> 0" "\<And>i. i \<le> n \<Longrightarrow> f$i = 0" |
179 assumes "f \<noteq> 0" "\<And>i. i \<le> n \<Longrightarrow> f$i = 0" |
208 shows "subdegree f > n" |
180 shows "subdegree f > n" |
209 proof (rule ccontr) |
181 by (meson assms leI nth_subdegree_nonzero) |
210 assume "\<not>(subdegree f > n)" |
|
211 with assms(2) have "f $ subdegree f = 0" by simp |
|
212 moreover from assms(1) have "f $ subdegree f \<noteq> 0" by simp |
|
213 ultimately show False by contradiction |
|
214 qed |
|
215 |
182 |
216 lemma subdegree_leI: |
183 lemma subdegree_leI: |
217 "f $ n \<noteq> 0 \<Longrightarrow> subdegree f \<le> n" |
184 "f $ n \<noteq> 0 \<Longrightarrow> subdegree f \<le> n" |
218 by (rule leI) auto |
185 using linorder_not_less by blast |
219 |
186 |
220 lemma subdegree_0 [simp]: "subdegree 0 = 0" |
187 lemma subdegree_0 [simp]: "subdegree 0 = 0" |
221 by (simp add: subdegree_def) |
188 by (simp add: subdegree_def) |
222 |
189 |
223 lemma subdegree_1 [simp]: "subdegree 1 = 0" |
190 lemma subdegree_1 [simp]: "subdegree 1 = 0" |
224 by (cases "(1::'a) = 0") |
191 by (metis fps_one_nth nth_subdegree_nonzero subdegree_0) |
225 (auto intro: subdegreeI fps_ext simp: subdegree_def) |
|
226 |
192 |
227 lemma subdegree_eq_0_iff: "subdegree f = 0 \<longleftrightarrow> f = 0 \<or> f $ 0 \<noteq> 0" |
193 lemma subdegree_eq_0_iff: "subdegree f = 0 \<longleftrightarrow> f = 0 \<or> f $ 0 \<noteq> 0" |
228 proof (cases "f = 0") |
194 using nth_subdegree_nonzero subdegree_leI by fastforce |
229 assume "f \<noteq> 0" |
|
230 thus ?thesis |
|
231 using nth_subdegree_nonzero[OF \<open>f \<noteq> 0\<close>] by (fastforce intro!: subdegreeI) |
|
232 qed simp_all |
|
233 |
195 |
234 lemma subdegree_eq_0 [simp]: "f $ 0 \<noteq> 0 \<Longrightarrow> subdegree f = 0" |
196 lemma subdegree_eq_0 [simp]: "f $ 0 \<noteq> 0 \<Longrightarrow> subdegree f = 0" |
235 by (simp add: subdegree_eq_0_iff) |
197 by (simp add: subdegree_eq_0_iff) |
236 |
198 |
237 lemma nth_subdegree_zero_iff [simp]: "f $ subdegree f = 0 \<longleftrightarrow> f = 0" |
199 lemma nth_subdegree_zero_iff [simp]: "f $ subdegree f = 0 \<longleftrightarrow> f = 0" |
271 proof (rule subdegree_add_ge') |
232 proof (rule subdegree_add_ge') |
272 have "f + g = 0 \<Longrightarrow> False" |
233 have "f + g = 0 \<Longrightarrow> False" |
273 proof- |
234 proof- |
274 assume fg: "f + g = 0" |
235 assume fg: "f + g = 0" |
275 have "\<And>n. f $ n = - g $ n" |
236 have "\<And>n. f $ n = - g $ n" |
276 proof- |
237 by (metis add_eq_0_iff equation_minus_iff fg fps_add_nth fps_neg_nth fps_zero_nth) |
277 fix n |
|
278 from fg have "(f + g) $ n = 0" by simp |
|
279 hence "f $ n + g $ n - g $ n = - g $ n" by simp |
|
280 thus "f $ n = - g $ n" by simp |
|
281 qed |
|
282 with assms show False by (auto intro: fps_ext) |
238 with assms show False by (auto intro: fps_ext) |
283 qed |
239 qed |
284 thus "f + g \<noteq> 0" by fast |
240 thus "f + g \<noteq> 0" by fast |
285 qed |
241 qed |
286 |
242 |
287 lemma subdegree_add_eq1: |
243 lemma subdegree_add_eq1: |
288 assumes "f \<noteq> 0" |
244 assumes "f \<noteq> 0" |
289 and "subdegree f < subdegree (g :: 'a::monoid_add fps)" |
245 and "subdegree f < subdegree (g :: 'a::monoid_add fps)" |
290 shows "subdegree (f + g) = subdegree f" |
246 shows "subdegree (f + g) = subdegree f" |
291 using assms |
247 using assms by(auto intro: subdegreeI simp: nth_less_subdegree_zero) |
292 by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
|
293 |
248 |
294 lemma subdegree_add_eq2: |
249 lemma subdegree_add_eq2: |
295 assumes "g \<noteq> 0" |
250 assumes "g \<noteq> 0" |
296 and "subdegree g < subdegree (f :: 'a :: monoid_add fps)" |
251 and "subdegree g < subdegree (f :: 'a :: monoid_add fps)" |
297 shows "subdegree (f + g) = subdegree g" |
252 shows "subdegree (f + g) = subdegree g" |
298 using assms |
253 using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
299 by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
|
300 |
254 |
301 lemma subdegree_diff_eq1: |
255 lemma subdegree_diff_eq1: |
302 assumes "f \<noteq> 0" |
256 assumes "f \<noteq> 0" |
303 and "subdegree f < subdegree (g :: 'a :: group_add fps)" |
257 and "subdegree f < subdegree (g :: 'a :: group_add fps)" |
304 shows "subdegree (f - g) = subdegree f" |
258 shows "subdegree (f - g) = subdegree f" |
305 using assms |
259 using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
306 by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
|
307 |
260 |
308 lemma subdegree_diff_eq1_cancel: |
261 lemma subdegree_diff_eq1_cancel: |
309 assumes "f \<noteq> 0" |
262 assumes "f \<noteq> 0" |
310 and "subdegree f < subdegree (g :: 'a :: cancel_comm_monoid_add fps)" |
263 and "subdegree f < subdegree (g :: 'a :: cancel_comm_monoid_add fps)" |
311 shows "subdegree (f - g) = subdegree f" |
264 shows "subdegree (f - g) = subdegree f" |
312 using assms |
265 using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
313 by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
|
314 |
266 |
315 lemma subdegree_diff_eq2: |
267 lemma subdegree_diff_eq2: |
316 assumes "g \<noteq> 0" |
268 assumes "g \<noteq> 0" |
317 and "subdegree g < subdegree (f :: 'a :: group_add fps)" |
269 and "subdegree g < subdegree (f :: 'a :: group_add fps)" |
318 shows "subdegree (f - g) = subdegree g" |
270 shows "subdegree (f - g) = subdegree g" |
319 using assms |
271 using assms by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
320 by (auto intro: subdegreeI simp: nth_less_subdegree_zero) |
|
321 |
272 |
322 lemma subdegree_diff_ge [simp]: |
273 lemma subdegree_diff_ge [simp]: |
323 assumes "f \<noteq> (g :: 'a :: group_add fps)" |
274 assumes "f \<noteq> (g :: 'a :: group_add fps)" |
324 shows "subdegree (f - g) \<ge> min (subdegree f) (subdegree g)" |
275 shows "subdegree (f - g) \<ge> min (subdegree f) (subdegree g)" |
325 proof- |
276 proof- |
326 from assms have "f = - (- g) \<Longrightarrow> False" using expand_fps_eq by fastforce |
277 have "f \<noteq> - (- g)" |
327 hence "f \<noteq> - (- g)" by fast |
278 using assms expand_fps_eq by fastforce |
328 moreover have "f + - g = f - g" by (simp add: fps_ext) |
279 moreover have "f + - g = f - g" by (simp add: fps_ext) |
329 ultimately show ?thesis |
280 ultimately show ?thesis |
330 using subdegree_add_ge[of f "-g"] by simp |
281 using subdegree_add_ge[of f "-g"] by simp |
331 qed |
282 qed |
332 |
283 |
333 lemma subdegree_diff_ge': |
284 lemma subdegree_diff_ge': |
334 fixes f g :: "'a :: comm_monoid_diff fps" |
285 fixes f g :: "'a :: comm_monoid_diff fps" |
335 assumes "f - g \<noteq> 0" |
286 assumes "f - g \<noteq> 0" |
336 shows "subdegree (f - g) \<ge> subdegree f" |
287 shows "subdegree (f - g) \<ge> subdegree f" |
337 using assms |
288 using assms by (auto intro: subdegree_geI simp: nth_less_subdegree_zero) |
338 by (auto intro: subdegree_geI simp: nth_less_subdegree_zero) |
|
339 |
289 |
340 lemma nth_subdegree_mult_left [simp]: |
290 lemma nth_subdegree_mult_left [simp]: |
341 fixes f g :: "('a :: {mult_zero,comm_monoid_add}) fps" |
291 fixes f g :: "('a :: {mult_zero,comm_monoid_add}) fps" |
342 shows "(f * g) $ (subdegree f) = f $ subdegree f * g $ 0" |
292 shows "(f * g) $ (subdegree f) = f $ subdegree f * g $ 0" |
343 by (cases "subdegree f") (simp_all add: fps_mult_nth nth_less_subdegree_zero) |
293 by (cases "subdegree f") (simp_all add: fps_mult_nth nth_less_subdegree_zero) |