481 apply (rule_tac z = x in eq_Abs_complex) |
481 apply (rule_tac z = x in eq_Abs_complex) |
482 apply (rule_tac z = y in eq_Abs_complex) |
482 apply (rule_tac z = y in eq_Abs_complex) |
483 apply (auto simp add: complex_mult complex_minus real_diff_def) |
483 apply (auto simp add: complex_mult complex_minus real_diff_def) |
484 done |
484 done |
485 |
485 |
486 declare complex_minus_mult_eq1 [symmetric, simp] complex_minus_mult_eq2 [symmetric, simp] |
|
487 |
|
488 lemma complex_mult_minus_one: "-(1::complex) * z = -z" |
|
489 apply (simp (no_asm)) |
|
490 done |
|
491 declare complex_mult_minus_one [simp] |
|
492 |
|
493 lemma complex_mult_minus_one_right: "z * -(1::complex) = -z" |
|
494 apply (subst complex_mult_commute) |
|
495 apply (simp (no_asm)) |
|
496 done |
|
497 declare complex_mult_minus_one_right [simp] |
|
498 |
|
499 lemma complex_minus_mult_cancel: "-x * -y = x * (y::complex)" |
|
500 apply (simp (no_asm)) |
|
501 done |
|
502 declare complex_minus_mult_cancel [simp] |
|
503 |
|
504 lemma complex_minus_mult_commute: "-x * y = x * -(y::complex)" |
|
505 apply (simp (no_asm)) |
|
506 done |
|
507 |
|
508 lemma complex_add_mult_distrib: "((z1::complex) + z2) * w = (z1 * w) + (z2 * w)" |
486 lemma complex_add_mult_distrib: "((z1::complex) + z2) * w = (z1 * w) + (z2 * w)" |
509 apply (rule_tac z = z1 in eq_Abs_complex) |
487 apply (rule_tac z = z1 in eq_Abs_complex) |
510 apply (rule_tac z = z2 in eq_Abs_complex) |
488 apply (rule_tac z = z2 in eq_Abs_complex) |
511 apply (rule_tac z = w in eq_Abs_complex) |
489 apply (rule_tac z = w in eq_Abs_complex) |
512 apply (auto simp add: complex_mult complex_add left_distrib real_diff_def add_ac) |
490 apply (auto simp add: complex_mult complex_add left_distrib real_diff_def add_ac) |
539 |
517 |
540 lemma COMPLEX_DIVISION_BY_ZERO: "a / (0::complex) = 0" |
518 lemma COMPLEX_DIVISION_BY_ZERO: "a / (0::complex) = 0" |
541 apply (simp (no_asm) add: complex_divide_def COMPLEX_INVERSE_ZERO) |
519 apply (simp (no_asm) add: complex_divide_def COMPLEX_INVERSE_ZERO) |
542 done |
520 done |
543 |
521 |
|
522 instance complex :: division_by_zero |
|
523 proof |
|
524 fix x :: complex |
|
525 show "inverse 0 = (0::complex)" by (rule COMPLEX_INVERSE_ZERO) |
|
526 show "x/0 = 0" by (rule COMPLEX_DIVISION_BY_ZERO) |
|
527 qed |
|
528 |
544 lemma complex_mult_inv_left: "z ~= (0::complex) ==> inverse(z) * z = 1" |
529 lemma complex_mult_inv_left: "z ~= (0::complex) ==> inverse(z) * z = 1" |
545 apply (rule_tac z = z in eq_Abs_complex) |
530 apply (rule_tac z = z in eq_Abs_complex) |
546 apply (auto simp add: complex_mult complex_inverse complex_one_def |
531 apply (auto simp add: complex_mult complex_inverse complex_one_def |
547 complex_zero_def add_divide_distrib [symmetric] real_power_two mult_ac) |
532 complex_zero_def add_divide_distrib [symmetric] real_power_two mult_ac) |
548 apply (drule_tac y = y in real_sum_squares_not_zero) |
533 apply (drule_tac y = y in real_sum_squares_not_zero) |
551 declare complex_mult_inv_left [simp] |
536 declare complex_mult_inv_left [simp] |
552 |
537 |
553 lemma complex_mult_inv_right: "z ~= (0::complex) ==> z * inverse(z) = 1" |
538 lemma complex_mult_inv_right: "z ~= (0::complex) ==> z * inverse(z) = 1" |
554 by (auto intro: complex_mult_commute [THEN subst]) |
539 by (auto intro: complex_mult_commute [THEN subst]) |
555 declare complex_mult_inv_right [simp] |
540 declare complex_mult_inv_right [simp] |
|
541 |
|
542 |
|
543 subsection {* The field of complex numbers *} |
|
544 |
|
545 instance complex :: field |
|
546 proof |
|
547 fix z u v w :: complex |
|
548 show "(u + v) + w = u + (v + w)" |
|
549 by (rule complex_add_assoc) |
|
550 show "z + w = w + z" |
|
551 by (rule complex_add_commute) |
|
552 show "0 + z = z" |
|
553 by (rule complex_add_zero_left) |
|
554 show "-z + z = 0" |
|
555 by (rule complex_add_minus_left_zero) |
|
556 show "z - w = z + -w" |
|
557 by (simp add: complex_diff_def) |
|
558 show "(u * v) * w = u * (v * w)" |
|
559 by (rule complex_mult_assoc) |
|
560 show "z * w = w * z" |
|
561 by (rule complex_mult_commute) |
|
562 show "1 * z = z" |
|
563 by (rule complex_mult_one_left) |
|
564 show "0 \<noteq> (1::complex)" --{*for some reason it has to be early*} |
|
565 by (rule complex_zero_not_eq_one) |
|
566 show "(u + v) * w = u * w + v * w" |
|
567 by (rule complex_add_mult_distrib) |
|
568 assume neq: "w \<noteq> 0" |
|
569 thus "z / w = z * inverse w" |
|
570 by (simp add: complex_divide_def) |
|
571 show "inverse w * w = 1" |
|
572 by (simp add: neq complex_mult_inv_left) |
|
573 qed |
|
574 |
|
575 |
|
576 lemma complex_mult_minus_one: "-(1::complex) * z = -z" |
|
577 apply (simp (no_asm)) |
|
578 done |
|
579 declare complex_mult_minus_one [simp] |
|
580 |
|
581 lemma complex_mult_minus_one_right: "z * -(1::complex) = -z" |
|
582 apply (subst complex_mult_commute) |
|
583 apply (simp (no_asm)) |
|
584 done |
|
585 declare complex_mult_minus_one_right [simp] |
|
586 |
|
587 lemma complex_minus_mult_cancel: "-x * -y = x * (y::complex)" |
|
588 apply (simp (no_asm)) |
|
589 done |
|
590 declare complex_minus_mult_cancel [simp] |
|
591 |
|
592 lemma complex_minus_mult_commute: "-x * y = x * -(y::complex)" |
|
593 apply (simp (no_asm)) |
|
594 done |
|
595 |
556 |
596 |
557 lemma complex_mult_left_cancel: "(c::complex) ~= 0 ==> (c*a=c*b) = (a=b)" |
597 lemma complex_mult_left_cancel: "(c::complex) ~= 0 ==> (c*a=c*b) = (a=b)" |
558 apply auto |
598 apply auto |
559 apply (drule_tac f = "%x. x*inverse c" in arg_cong) |
599 apply (drule_tac f = "%x. x*inverse c" in arg_cong) |
560 apply (simp add: complex_mult_ac) |
600 apply (simp add: complex_mult_ac) |
601 apply (rule_tac c1 = "-x" in complex_mult_right_cancel [THEN iffD1], force) |
641 apply (rule_tac c1 = "-x" in complex_mult_right_cancel [THEN iffD1], force) |
602 apply (subst complex_mult_inv_left, auto) |
642 apply (subst complex_mult_inv_left, auto) |
603 done |
643 done |
604 |
644 |
605 lemma complex_inverse_distrib: "inverse(x*y) = inverse x * inverse (y::complex)" |
645 lemma complex_inverse_distrib: "inverse(x*y) = inverse x * inverse (y::complex)" |
606 apply (case_tac "x = 0", simp add: COMPLEX_INVERSE_ZERO) |
646 apply (rule inverse_mult_distrib) |
607 apply (case_tac "y = 0", simp add: COMPLEX_INVERSE_ZERO) |
|
608 apply (rule_tac c1 = "x*y" in complex_mult_left_cancel [THEN iffD1]) |
|
609 apply (auto simp add: complex_mult_not_zero complex_mult_ac) |
|
610 apply (auto simp add: complex_mult_not_zero complex_mult_assoc [symmetric]) |
|
611 done |
647 done |
612 |
648 |
613 |
649 |
614 subsection{*Division*} |
650 subsection{*Division*} |
615 |
651 |