621 assumes "\<And>i. norm(x$i) \<le> norm(y$i)" |
621 assumes "\<And>i. norm(x$i) \<le> norm(y$i)" |
622 shows "norm x \<le> norm y" |
622 shows "norm x \<le> norm y" |
623 unfolding norm_vec_def |
623 unfolding norm_vec_def |
624 by (rule L2_set_mono) (auto simp: assms) |
624 by (rule L2_set_mono) (auto simp: assms) |
625 |
625 |
626 lemma norm_eq_0_imp: "norm x = 0 ==> x = (0::real ^'n)" by (metis norm_eq_zero) |
|
627 |
|
628 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x" |
626 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x" |
629 apply (simp add: norm_vec_def) |
627 apply (simp add: norm_vec_def) |
630 apply (rule member_le_L2_set, simp_all) |
628 apply (rule member_le_L2_set, simp_all) |
631 done |
629 done |
632 |
630 |
972 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib) |
970 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib) |
973 |
971 |
974 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::'a::field) = b \<or> x = 0" |
972 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::'a::field) = b \<or> x = 0" |
975 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib) |
973 by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib) |
976 |
974 |
977 lemma vector_mul_lcancel_imp: "a \<noteq> (0::'a::field) ==> a *s x = a *s y ==> (x = y)" |
|
978 by (metis vector_mul_lcancel) |
|
979 |
|
980 lemma vector_mul_rcancel_imp: "x \<noteq> 0 \<Longrightarrow> (a::'a::field) *s x = b *s x ==> a = b" |
|
981 by (metis vector_mul_rcancel) |
|
982 |
|
983 lemma scalar_mult_eq_scaleR [abs_def]: "c *s x = c *\<^sub>R x" |
975 lemma scalar_mult_eq_scaleR [abs_def]: "c *s x = c *\<^sub>R x" |
984 unfolding scaleR_vec_def vector_scalar_mult_def by simp |
976 unfolding scaleR_vec_def vector_scalar_mult_def by simp |
985 |
977 |
986 lemma dist_mul[simp]: "dist (c *s x) (c *s y) = \<bar>c\<bar> * dist x y" |
978 lemma dist_mul[simp]: "dist (c *s x) (c *s y) = \<bar>c\<bar> * dist x y" |
987 unfolding dist_norm scalar_mult_eq_scaleR |
979 unfolding dist_norm scalar_mult_eq_scaleR |
1039 definition "(row::'m => 'a ^'n^'m \<Rightarrow> 'a ^'n) i A = (\<chi> j. ((A$i)$j))" |
1031 definition "(row::'m => 'a ^'n^'m \<Rightarrow> 'a ^'n) i A = (\<chi> j. ((A$i)$j))" |
1040 definition "(column::'n =>'a^'n^'m =>'a^'m) j A = (\<chi> i. ((A$i)$j))" |
1032 definition "(column::'n =>'a^'n^'m =>'a^'m) j A = (\<chi> i. ((A$i)$j))" |
1041 definition "rows(A::'a^'n^'m) = { row i A | i. i \<in> (UNIV :: 'm set)}" |
1033 definition "rows(A::'a^'n^'m) = { row i A | i. i \<in> (UNIV :: 'm set)}" |
1042 definition "columns(A::'a^'n^'m) = { column i A | i. i \<in> (UNIV :: 'n set)}" |
1034 definition "columns(A::'a^'n^'m) = { column i A | i. i \<in> (UNIV :: 'n set)}" |
1043 |
1035 |
|
1036 lemma times0_left [simp]: "(0::'a::semiring_1^'n^'m) ** (A::'a ^'p^'n) = 0" |
|
1037 by (simp add: matrix_matrix_mult_def zero_vec_def) |
|
1038 |
|
1039 lemma times0_right [simp]: "(A::'a::semiring_1^'n^'m) ** (0::'a ^'p^'n) = 0" |
|
1040 by (simp add: matrix_matrix_mult_def zero_vec_def) |
|
1041 |
1044 lemma mat_0[simp]: "mat 0 = 0" by (vector mat_def) |
1042 lemma mat_0[simp]: "mat 0 = 0" by (vector mat_def) |
1045 lemma matrix_add_ldistrib: "(A ** (B + C)) = (A ** B) + (A ** C)" |
1043 lemma matrix_add_ldistrib: "(A ** (B + C)) = (A ** B) + (A ** C)" |
1046 by (vector matrix_matrix_mult_def sum.distrib[symmetric] field_simps) |
1044 by (vector matrix_matrix_mult_def sum.distrib[symmetric] field_simps) |
1047 |
1045 |
1048 lemma matrix_mul_lid [simp]: |
1046 lemma matrix_mul_lid [simp]: |
1073 apply (vector matrix_matrix_mult_def matrix_vector_mult_def |
1071 apply (vector matrix_matrix_mult_def matrix_vector_mult_def |
1074 sum_distrib_left sum_distrib_right mult.assoc) |
1072 sum_distrib_left sum_distrib_right mult.assoc) |
1075 apply (subst sum.swap) |
1073 apply (subst sum.swap) |
1076 apply simp |
1074 apply simp |
1077 done |
1075 done |
|
1076 |
|
1077 lemma scalar_matrix_assoc: |
|
1078 fixes A :: "('a::real_algebra_1)^'m^'n" |
|
1079 shows "k *\<^sub>R (A ** B) = (k *\<^sub>R A) ** B" |
|
1080 by (simp add: matrix_matrix_mult_def sum_distrib_left mult_ac vec_eq_iff scaleR_sum_right) |
|
1081 |
|
1082 lemma matrix_scalar_ac: |
|
1083 fixes A :: "('a::real_algebra_1)^'m^'n" |
|
1084 shows "A ** (k *\<^sub>R B) = k *\<^sub>R A ** B" |
|
1085 by (simp add: matrix_matrix_mult_def sum_distrib_left mult_ac vec_eq_iff) |
1078 |
1086 |
1079 lemma matrix_vector_mul_lid [simp]: "mat 1 *v x = (x::'a::semiring_1 ^ 'n)" |
1087 lemma matrix_vector_mul_lid [simp]: "mat 1 *v x = (x::'a::semiring_1 ^ 'n)" |
1080 apply (vector matrix_vector_mult_def mat_def) |
1088 apply (vector matrix_vector_mult_def mat_def) |
1081 apply (simp add: if_distrib if_distribR sum.delta' cong del: if_weak_cong) |
1089 apply (simp add: if_distrib if_distribR sum.delta' cong del: if_weak_cong) |
1082 done |
1090 done |
1096 apply (erule_tac x="i" in allE) |
1104 apply (erule_tac x="i" in allE) |
1097 apply (auto simp add: if_distrib if_distribR axis_def |
1105 apply (auto simp add: if_distrib if_distribR axis_def |
1098 sum.delta[OF finite] cong del: if_weak_cong) |
1106 sum.delta[OF finite] cong del: if_weak_cong) |
1099 done |
1107 done |
1100 |
1108 |
1101 lemma matrix_vector_mul_component: "((A::real^_^_) *v x)$k = inner (A$k) x" |
1109 lemma matrix_vector_mul_component: "(A *v x)$k = inner (A$k) x" |
1102 by (simp add: matrix_vector_mult_def inner_vec_def) |
1110 by (simp add: matrix_vector_mult_def inner_vec_def) |
1103 |
1111 |
1104 lemma dot_lmul_matrix: "inner ((x::real ^_) v* A) y = inner x (A *v y)" |
1112 lemma dot_lmul_matrix: "inner ((x::real ^_) v* A) y = inner x (A *v y)" |
1105 apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps) |
1113 apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps) |
1106 apply (subst sum.swap) |
1114 apply (subst sum.swap) |
1123 by (auto simp add: rows_def columns_def intro: set_eqI) |
1131 by (auto simp add: rows_def columns_def intro: set_eqI) |
1124 |
1132 |
1125 lemma columns_transpose [simp]: "columns(transpose A) = rows A" |
1133 lemma columns_transpose [simp]: "columns(transpose A) = rows A" |
1126 by (metis transpose_transpose rows_transpose) |
1134 by (metis transpose_transpose rows_transpose) |
1127 |
1135 |
|
1136 lemma transpose_scalar: "transpose (k *\<^sub>R A) = k *\<^sub>R transpose A" |
|
1137 unfolding transpose_def |
|
1138 by (simp add: vec_eq_iff) |
|
1139 |
|
1140 lemma transpose_iff [iff]: "transpose A = transpose B \<longleftrightarrow> A = B" |
|
1141 by (metis transpose_transpose) |
|
1142 |
1128 lemma matrix_mult_sum: |
1143 lemma matrix_mult_sum: |
1129 "(A::'a::comm_semiring_1^'n^'m) *v x = sum (\<lambda>i. (x$i) *s column i A) (UNIV:: 'n set)" |
1144 "(A::'a::comm_semiring_1^'n^'m) *v x = sum (\<lambda>i. (x$i) *s column i A) (UNIV:: 'n set)" |
1130 by (simp add: matrix_vector_mult_def vec_eq_iff column_def mult.commute) |
1145 by (simp add: matrix_vector_mult_def vec_eq_iff column_def mult.commute) |
1131 |
1146 |
1132 lemma vector_componentwise: |
1147 lemma vector_componentwise: |
1146 by (simp add: mat_def matrix_def axis_def) |
1161 by (simp add: mat_def matrix_def axis_def) |
1147 |
1162 |
1148 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r" |
1163 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r" |
1149 by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong) |
1164 by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong) |
1150 |
1165 |
1151 lemma matrix_vector_mul_linear[intro, simp]: "linear (\<lambda>x. A *v (x::real ^ _))" |
1166 lemma matrix_vector_mul_linear[intro, simp]: "linear (\<lambda>x. A *v (x::'a::real_algebra_1 ^ _))" |
1152 by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff |
1167 by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff field_simps sum_distrib_left sum.distrib) |
1153 field_simps sum_distrib_left sum.distrib) |
1168 |
1154 |
1169 lemma vector_matrix_left_distrib [algebra_simps]: |
1155 lemma matrix_vector_mult_add_distrib [algebra_simps]: |
1170 shows "(x + y) v* A = x v* A + y v* A" |
|
1171 unfolding vector_matrix_mult_def |
|
1172 by (simp add: algebra_simps sum.distrib vec_eq_iff) |
|
1173 |
|
1174 lemma matrix_vector_right_distrib [algebra_simps]: |
1156 "A *v (x + y) = A *v x + A *v y" |
1175 "A *v (x + y) = A *v x + A *v y" |
1157 by (vector matrix_vector_mult_def sum.distrib distrib_left) |
1176 by (vector matrix_vector_mult_def sum.distrib distrib_left) |
1158 |
1177 |
1159 lemma matrix_vector_mult_diff_distrib [algebra_simps]: |
1178 lemma matrix_vector_mult_diff_distrib [algebra_simps]: |
1160 fixes A :: "'a::ring_1^'n^'m" |
1179 fixes A :: "'a::ring_1^'n^'m" |
1198 fixes A::"'a::field^'n^'m" |
1217 fixes A::"'a::field^'n^'m" |
1199 assumes "invertible A" |
1218 assumes "invertible A" |
1200 shows "inj (( *v) A)" |
1219 shows "inj (( *v) A)" |
1201 by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid) |
1220 by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid) |
1202 |
1221 |
1203 end |
1222 lemma scalar_invertible: |
|
1223 fixes A :: "('a::real_algebra_1)^'m^'n" |
|
1224 assumes "k \<noteq> 0" and "invertible A" |
|
1225 shows "invertible (k *\<^sub>R A)" |
|
1226 proof - |
|
1227 obtain A' where "A ** A' = mat 1" and "A' ** A = mat 1" |
|
1228 using assms unfolding invertible_def by auto |
|
1229 with `k \<noteq> 0` |
|
1230 have "(k *\<^sub>R A) ** ((1/k) *\<^sub>R A') = mat 1" "((1/k) *\<^sub>R A') ** (k *\<^sub>R A) = mat 1" |
|
1231 by (simp_all add: assms matrix_scalar_ac) |
|
1232 thus "invertible (k *\<^sub>R A)" |
|
1233 unfolding invertible_def by auto |
|
1234 qed |
|
1235 |
|
1236 lemma scalar_invertible_iff: |
|
1237 fixes A :: "('a::real_algebra_1)^'m^'n" |
|
1238 assumes "k \<noteq> 0" and "invertible A" |
|
1239 shows "invertible (k *\<^sub>R A) \<longleftrightarrow> k \<noteq> 0 \<and> invertible A" |
|
1240 by (simp add: assms scalar_invertible) |
|
1241 |
|
1242 lemma vector_transpose_matrix [simp]: "x v* transpose A = A *v x" |
|
1243 unfolding transpose_def vector_matrix_mult_def matrix_vector_mult_def |
|
1244 by simp |
|
1245 |
|
1246 lemma transpose_matrix_vector [simp]: "transpose A *v x = x v* A" |
|
1247 unfolding transpose_def vector_matrix_mult_def matrix_vector_mult_def |
|
1248 by simp |
|
1249 |
|
1250 lemma vector_scalar_commute: |
|
1251 fixes A :: "'a::{field}^'m^'n" |
|
1252 shows "A *v (c *s x) = c *s (A *v x)" |
|
1253 by (simp add: vector_scalar_mult_def matrix_vector_mult_def mult_ac sum_distrib_left) |
|
1254 |
|
1255 lemma scalar_vector_matrix_assoc: |
|
1256 fixes k :: "'a::{field}" and x :: "'a::{field}^'n" and A :: "'a^'m^'n" |
|
1257 shows "(k *s x) v* A = k *s (x v* A)" |
|
1258 by (metis transpose_matrix_vector vector_scalar_commute) |
|
1259 |
|
1260 lemma vector_matrix_mult_0 [simp]: "0 v* A = 0" |
|
1261 unfolding vector_matrix_mult_def by (simp add: zero_vec_def) |
|
1262 |
|
1263 lemma vector_matrix_mult_0_right [simp]: "x v* 0 = 0" |
|
1264 unfolding vector_matrix_mult_def by (simp add: zero_vec_def) |
|
1265 |
|
1266 lemma vector_matrix_mul_rid [simp]: |
|
1267 fixes v :: "('a::semiring_1)^'n" |
|
1268 shows "v v* mat 1 = v" |
|
1269 by (metis matrix_vector_mul_lid transpose_mat vector_transpose_matrix) |
|
1270 |
|
1271 lemma scaleR_vector_matrix_assoc: |
|
1272 fixes k :: real and x :: "real^'n" and A :: "real^'m^'n" |
|
1273 shows "(k *\<^sub>R x) v* A = k *\<^sub>R (x v* A)" |
|
1274 by (metis matrix_vector_mult_scaleR transpose_matrix_vector) |
|
1275 |
|
1276 lemma vector_scaleR_matrix_ac: |
|
1277 fixes k :: real and x :: "real^'n" and A :: "real^'m^'n" |
|
1278 shows "x v* (k *\<^sub>R A) = k *\<^sub>R (x v* A)" |
|
1279 proof - |
|
1280 have "x v* (k *\<^sub>R A) = (k *\<^sub>R x) v* A" |
|
1281 unfolding vector_matrix_mult_def |
|
1282 by (simp add: algebra_simps) |
|
1283 with scaleR_vector_matrix_assoc |
|
1284 show "x v* (k *\<^sub>R A) = k *\<^sub>R (x v* A)" |
|
1285 by auto |
|
1286 qed |
|
1287 |
|
1288 end |