问题标签 [commutativity]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
267 浏览

python - Sympy:将其数值替换为符号玻色子变换

我想使用 sympy 简化涉及玻色子换向器的表达式。问题是,在 sympy 中使用 secondquant,玻色子换向器 [b_0,b^\dagger_0]=1 和 [b_0,b^\dagger_1]=0 的数值永远不会被符号表达式替代。换句话说,我希望 SymPy 知道换向器的身份。

以下代码

而不是预期值:

我已经尝试过这里提到的代码如何使用 sympy.physics.quantum 换向器?

但这给出了与以前相同的表达式

此外,我发现了这个相关的未回答问题: sympy 是否给我第二个量化换向器的错误结果?

我在这里查看了第 1682 行: https ://github.com/sympy/sympy/blob/master/sympy/physics/secondquant.py ,据此,换向器应该正确地给出克罗内克三角洲。但是,我仍然得到上面报告的符号表达式。

0 投票
0 回答
33 浏览

database - 避免 MongoDB 中的交换重复

背景

我正在使用 MongoDB 数据库构建一个医疗应用程序,其中存储药物信息。该数据库中有一些集合,其中之一是成对药物相互作用。提供给我的数据是基于每种药物的。也就是说,如果A是与BCD相互作用的药物,我会得到(A,B)(A,C)和对(A,D)但是,在解析药物BCD(B,A)等形式的输入数据时,我再次获得了相同的信息。

当然,相应的医学信息是相同的(即,AB交互产生与BA交互相同的反应)。

集合结构

该集合的结构是每个都document具有三个字段:name1name2description

在第一次创建集合并填充它时,有没有办法索引这个集合,以便将(name1, name2)其视为重复项(name2, name1)(因为它们都将具有相同的description)?我不想在集合中插入这样的重复项。

PS 我正在使用MongoDB Java Driver 3.8和 MongoDB 4.0.3。

PPS 示例文档和表格索引信息添加如下:

我在name1和上有一个升序索引,name2description. 上述文件是为 Lepirudin 插入的。我想避免为圣约翰草插入以下文件:

0 投票
1 回答
317 浏览

python - 强制 SymPy 符号不与矩阵通勤

我正在使用 SymPy 来求解线性矩阵方程组。但是,我没有使用 SymPy 的 MatrixSymbol 对象,因为它似乎与solve_linear_system. 因此,我只是使用带有 的普通符号commutative=False,这似乎工作正常。

但是,当我尝试最终替换矩阵来评估解决方案时,我遇到了非交换 SymPy 符号仍然允许与 SymPy 矩阵交换的问题。例如:

当代入多个值时,这会导致不正确的矩阵乘法顺序:

有没有办法在替换过程中避免符号与矩阵交换?simultaneous=True在通话中使用subs没有帮助。

0 投票
1 回答
114 浏览

sql - SQL中连接的交换性

StackOverflow 上有一些关于连接交换性的讨论,例如1234。它变得非常复杂,我认为他们中的任何一个都不能在这里回答我的问题。

我经常注意到,当我将查询的 SQL 放入 Access 时,Access 会弄乱我的联接顺序,甚至将LEFT联接更改为联接RIGHT。我通常将外连接写为LEFTs,按逻辑排列连接表的顺序,所以当 Access 搞砸时我不喜欢它。但是现在我注意到查询在设计视图中的表示方式有所不同,我想知道这种差异是否显着。

以下是三个查询:

查询1

查询2

查询3

我更喜欢 Query3,因为它具有我提到的逻辑顺序。

当我将这些查询作为 SQL 输入时,Access 将 Query2 的代码更改为与 Query1 相同,并且没有修改 Query1 或 Query3 的代码。当运行这三个查询时(使用非常简单的数据,因此不是结论性的),它们都会产生相同的结果。在设计视图中,Query1 和 Query2 看起来相同,这很好,因为 Access 将 Query2 转换为 Query1。Query3 看起来几乎一样,只是 Table2 和 Table12 之间的关系在 Query1 的视图中表示,而 Query2 在 Query3 的视图中没有表示。

测试 SQL 连接交换性的三个查询

所以我的问题是,Query3 是否等同于 Query1 和 Query2,因此可以安全地忽略设计视图中表关系表示的丢失,或者查询中是否存在操作差异?如果存在差异,是否有连接排序的指导原则?

0 投票
1 回答
263 浏览

swift - Swift - 具有交换性的模式匹配

Swift - 具有可交换性的关联值的模式匹配枚举

斯威夫特 5.0,Xcode 10.2.1

Expression在 Swift 中有一个枚举。


第一次尝试

我对我的Expression类型执行了很多模式匹配。加法和乘法的交换性使模式匹配表达式变得很长。我想找到一种方法来简化和缩短它,所以我决定创建一个ExpressionPattern枚举并定义模式匹配运算符 ( ~=) 的重载。

我希望能够替换模式匹配语句,例如:

和:

不过,当我第一次尝试这样做时,我收到一条错误消息,说“模式变量绑定不能出现在表达式中”。

注意:如果我使用没有值绑定的准确的最终值,我认为这个匹配有效,但我在整个项目的许多地方都使用了这个特性。

尝试用法:


第二次尝试

对于我的第二次尝试,我更改了Expression'==函数的定义,并尝试覆盖其默认实现~=.

尝试用法:

注意:理想情况下,这应该打印“匹配”。


问题

在考虑某些情况的交换性的同时,我如何找到一种使用成熟模式匹配的方法。

注意:这必须能够用于匹配具有可交换性的嵌套案例(即.add(.multiply(..., ...), ...))。这一点尤其重要,因为在匹配加法和乘法时需要更多的情况。

0 投票
0 回答
91 浏览

python - Python遍历唯一的交换方程

受此视频的数学启发,我很好奇获得一个数字 n 需要多长时间,我可以在其中使用数字 1 以及二进制基数中的加法和减法等一些运算。目前,我有这样的编码:

这里,“|” 指连接,因此combo = ("+","|","*","|","|")将解析为1+11*111 = 1+3*7 = 22. 我正在使用它来建立一个表,其中有多少个数字是 m 操作,并研究它是如何增长的。目前我正在使用 itertools 产品功能来搜索所有可能的操作组合,尽管这有点重复,因为“+”和“*”都是可交换操作。有没有一种干净的方法来只生成可交换的唯一表达式?

目前,我最好的想法是有第二个蛮力程序,brute2(k)它只使用操作“*”和“|”,然后有:

如果我记住事情,这将是相当不错的,但我不确定是否有比这更 Pythonic 或更有效的方法。此外,如果我决定在减法中添加更多操作,这将无法完全概括。

我希望实现的是洞察是否有一些模块或简单的方法可以有效地迭代操作组合。目前,itertools.product复杂度为 O(3^m)。但是,通过记忆和使用该brute2方法,我似乎可以将复杂度降低到 O(|brute(m-1)|),这似乎是渐近的 ~O(1.5^m)。虽然我对第二种方法比较满意,但如果有一种更通用的方法可以扩展到任意数量的操作,其中一些是可交换的,那就太好了。

更新:

我现在已经把我的第二个想法编码了。有了这个,当我的旧代码在 20 次操作后卡住了几个小时时,我能够快速获得 42 次操作中可访问的所有数字。这是新代码:

我要概括这一点,您订购所有可交换操作,[op_1,op_2,... op_x],让 brute(n,0) 返回所有可通过 n 个非交换操作到达的数字,然后:

但是,您必须注意操作顺序。如果我先加法再乘法,事情会完全不同,这会说不同的事情。如果有像 PEMDAS 这样的层次结构,并且您不想考虑括号,我相信您只是按优先级降序列出操作,即 op_1 是您执行的第一个操作等。如果您允许一般括号,那么您应该有我相信这样的事情:

我对我们有某种 PEMDAS 系统的情况更感兴趣,括号是由操作顺序暗示的,但仍然欢迎对任何一种情况的有效性/效率提供反馈。

0 投票
1 回答
62 浏览

haskell - Haskell:使用翻转导致错误:'.>' 的方程有不同数量的参数

我很难理解这里发生了什么。我想实现一个数据类型Direction并为它定义一个交换运算符.>。到目前为止,我有这个:

我得到错误Equations for ‘.>’ have different numbers of arguments。这就是我不明白的,因为在 ghci 中检查时等式的两边都有相同数量的参数:

我可以通过编写d1 .> d2 = d2 .> d1而不是使用来解决错误,flip我不明白为什么翻转不起作用。有任何想法吗?

编辑:删除第二个不相关的问题

0 投票
3 回答
134 浏览

python - 大熊猫的groupby是可交换的吗?

我想知道是否由以下人员选择的行:

与选择的行相同:

在这种情况下,行的顺序无关紧要。

groupby没有不满足交换性质的情况?

0 投票
1 回答
133 浏览

f# - 有没有更好的方法在 F#/OCaml 中编写交换函数?

有没有更优雅或更好的方法来在 F#/OCaml 中编写交换函数,而不是列出所有可能的情况?

当我写这个问题时,我认为如果没有找到匹配项,可以使函数递归并交换参数。

但是,如果我采用这种方法,除非我添加另一个参数,其值指示它是否是第二次调用该函数并返回默认值而不是调用带有交换的函数args 如果是这样的话。

还有其他想法吗?该语言是否提供了一种结构来表达我定义的函数是可交换的这一事实?

0 投票
1 回答
63 浏览

c# - 在 C# 中应该如何有效地实现交换运算符重载?

假设我有一个Vector3带有重载运算符 * 的类型,允许乘以双精度数:

只有一个重载,类似于表达式new Vector3(1,2,3) * 1.5将编译但1.5 * new Vector3(1,2,3)不会。由于向量标量乘法是可交换的,我希望任一顺序都可以工作,因此我添加了另一个重载,其参数反转,只会调用原始重载:

这是做事的正确方法吗?是否应该将第二个重载实现为

反而?天真地,我希望编译器优化“额外”调用,并尽可能使用第一个重载(或者可能用长重载的主体替换短重载的主体),但我不知道的行为C# 编译器足以说明任何一种方式。

我意识到,在许多情况下,这是一种与算法选择相形见绌的性能问题,但在某些情况下,挤压每一次性能下降是至关重要的。在性能关键的情况下,是否应该将交换运算符重载实现为两个除了参数顺序之外都相同的重载,还是将一个委托给另一个委托是否同样有效?