代数 - 環上の加群
環 \(R\) が加法アーベル群 \((M, +)\) への右作用 \[M \times R \to M\] になっているとき, \(M\) を \(R\)-加群 といい, この作用のことを スカラー倍 という.
ただし,
- \((x+y) a = xa + ya ,~ x,y \in M ,~ a \in R\)
- \(x (a+b) = xa + xb ,~ x \in M ,~ a,b \in R\)
- \(x (ab) = (xa) b ,~ x \in M ,~ a,b \in R\)
- \(x1 = x ,~ x \in M ,~ 1 \in R\)
を満たすこと. 例えば, 体 \(F\) 上のベクトル空間 \(V\) は \(F\)-加群.
以下の実装では都合上, 右加群としてあるのと, 必ずしも必要としないので, 加法アーベル群であることは気にせずに, 作用だけを std::ops::Mul
で要請してある.
/// 代数 - 環上の加群 (Right-Module)
// Self should be AGroup (Additive Group)
pub trait Module<R>: std::ops::Mul<R, Output = Self> {}
#[cfg(test)]
mod test_module {
use crate::algebra::module::*;
#[test]
fn test_vector_is_module() {
struct MyVect {
data: Vec<i64>,
}
impl std::ops::Mul<i64> for MyVect {
type Output = Self;
fn mul(self, scalar: i64) -> Self::Output {
let data: Vec<i64> = self.data.iter().map(|&x| x * scalar).collect();
Self { data }
}
}
impl Module<i64> for MyVect {}
let v = MyVect {
data: vec![1, 2, 3],
};
let u = v * (-1);
assert_eq!(u.data, vec![-1, -2, -3]);
}
}