C# 和 Java long 是否形成交换环?
Do C# and Java longs form a commutative ring?
A ring 是一个标准的数学结构,描述了可以相加和相乘的对象。 C# 和 Java signed long
是否遵守环的所有属性?例如,乘以 Long.MIN_VALUE 是否总是关联和分配的?假设我们处于未经检查的上下文中。
(从维基百科复制的定义)
环是具有二元运算+和·的集合R,满足以下三组公理,称为环公理。
- R是加法下的阿贝尔群,也就是说
- (a + b) + c = a + (b + c) 对于 R 中的所有 a、b、c(+ 是关联的)。
- a + b = b + a for all a, b in R (+ is commutative).
- R中有一个元素0使得a + 0 = a对于R中的所有a(0是加法恒等式)。
- 对于 R 中的每个 a,R 中存在 −a 使得 a + (−a) = 0(−a 是 a 的加法逆)。
- R是乘法下的幺半群,意思是:
- (a ⋅ b) ⋅ c = a ⋅ (b ⋅ c) 对于 R 中的所有 a、b、c(⋅ 是关联的)。
- R中有一个元素1使得a ⋅ 1 = a且1 ⋅ a = a对于R中的所有a(1是乘法恒等式)。
- 乘法相对于加法是分配的:
- a ⋅ (b + c) = (a ⋅ b) + (a ⋅ c) 对于 R 中的所有 a、b、c(左分配)。
- (b + c) ⋅ a = (b ⋅ a) + (c ⋅ a) 对于 R 中的所有 a、b、c(右分配)。
交换环是乘法可交换的环(意思是 a ⋅ b = b ⋅ a)。
至少根据Java的溢出规则,有符号长整型的加法、减法和乘法完全等同于将64位视为64位无符号值时得到的结果,即与将它们视为整数 mod 2^64 相同,这足以证明该主张。
在平台上,溢出的有符号值被定义为包装,有符号和无符号值在馈送到 +
、-
、*
、&
、^
、|
、<<
和 ~
运算符,或者在对较小类型执行未经检查的转换时。当与关系运算符 >>
、%
和 /
运算符一起使用时,以及在转换或提升为更大的类型时,它们的行为会有所不同。
由于任何给定大小的无符号值都将表现为一个环,因此有符号值也将如此。请注意,由于对 int
的隐式提升,较小的类型可能不一定表现为算术环,因为将 +
和 *
应用于此类类型的某些值可能会产生一些不是值的东西那种类型。
A ring 是一个标准的数学结构,描述了可以相加和相乘的对象。 C# 和 Java signed long
是否遵守环的所有属性?例如,乘以 Long.MIN_VALUE 是否总是关联和分配的?假设我们处于未经检查的上下文中。
(从维基百科复制的定义)
环是具有二元运算+和·的集合R,满足以下三组公理,称为环公理。
- R是加法下的阿贝尔群,也就是说
- (a + b) + c = a + (b + c) 对于 R 中的所有 a、b、c(+ 是关联的)。
- a + b = b + a for all a, b in R (+ is commutative).
- R中有一个元素0使得a + 0 = a对于R中的所有a(0是加法恒等式)。
- 对于 R 中的每个 a,R 中存在 −a 使得 a + (−a) = 0(−a 是 a 的加法逆)。
- R是乘法下的幺半群,意思是:
- (a ⋅ b) ⋅ c = a ⋅ (b ⋅ c) 对于 R 中的所有 a、b、c(⋅ 是关联的)。
- R中有一个元素1使得a ⋅ 1 = a且1 ⋅ a = a对于R中的所有a(1是乘法恒等式)。
- 乘法相对于加法是分配的:
- a ⋅ (b + c) = (a ⋅ b) + (a ⋅ c) 对于 R 中的所有 a、b、c(左分配)。
- (b + c) ⋅ a = (b ⋅ a) + (c ⋅ a) 对于 R 中的所有 a、b、c(右分配)。
交换环是乘法可交换的环(意思是 a ⋅ b = b ⋅ a)。
至少根据Java的溢出规则,有符号长整型的加法、减法和乘法完全等同于将64位视为64位无符号值时得到的结果,即与将它们视为整数 mod 2^64 相同,这足以证明该主张。
在平台上,溢出的有符号值被定义为包装,有符号和无符号值在馈送到 +
、-
、*
、&
、^
、|
、<<
和 ~
运算符,或者在对较小类型执行未经检查的转换时。当与关系运算符 >>
、%
和 /
运算符一起使用时,以及在转换或提升为更大的类型时,它们的行为会有所不同。
由于任何给定大小的无符号值都将表现为一个环,因此有符号值也将如此。请注意,由于对 int
的隐式提升,较小的类型可能不一定表现为算术环,因为将 +
和 *
应用于此类类型的某些值可能会产生一些不是值的东西那种类型。