我在朋友家吃晚饭,他们提出了“素数向量空间”的想法。在此空间中,将正整数表示为向量,以使向量中的第n个元素是第n个素数除以该数目的次数。(请注意,这意味着我们的向量具有无限数量的项。)例如20为
2 0 1 0 0 0 ...
因为它的质因子分解是2 * 2 * 5。
由于素因数分解是唯一的,所以每个数字都对应一个向量。
我们可以通过成对添加向量来添加向量。这与将它们关联的数字相乘相同。我们还可以进行标量乘法,这类似于将相关数提高为幂。
问题在于该空间实际上不是矢量空间,因为没有逆。如果继续进行加和逆运算并关闭向量空间,我们现在可以将每个正有理数表示为向量。如果我们保留向量加法表示乘法的事实。那么自然数的倒数就是它的倒数。
例如,数字20具有向量
2 0 1 0 0 0 ...
因此,1/20是其倒数
-2 0 -1 0 0 0 ...
如果我们想找到与14/15之类的分数相关的向量,我们将找到14
1 0 0 1 0 0 ...
和1/15
0 -1 -1 0 0 0 ...
并通过执行矢量加法将它们相乘
1 -1 -1 1 0 0 ...
现在我们有了向量空间,我们可以通过给它一个内积来修改它以形成一个内积空间。为此,我们窃取了向量空间是经典给出的内积。两个向量的内积定义为其项的成对相乘之和。例如20·14/15 将计算如下
20 = 2 0 1 0 0 0 ...
14/15 = 1 -1 -1 1 0 0 ...
2 0 -1 0 0 0 ... -> 1
再举一个例子,产品2 /19·4/19
2/19 = 1 0 0 0 0 0 0 -1 0 0 0 ...
4/19 = 2 0 0 0 0 0 0 -1 0 0 0 ...
2 0 0 0 0 0 0 1 0 0 0 ... -> 3
您的任务是实现一个执行该点积的程序。它应通过一对正整数(分子和分母)或有理类型(不允许浮点数,因为它们会导致精度和可除性问题)来获取两个正有理数,并且应输出代表两个点积的整数输入。
这是代码高尔夫球,因此答案将以字节计分,而字节数越少越好。
测试用例
4 · 4 = 4
8 · 8 = 9
10 · 10 = 2
12 · 12 = 5
4 · 1/4 = -4
20 · 14/15 = 1
2/19 · 4/19 = 3