假设我有一个不重复的十进制数数组:
v1 = 0.0588235294117647, 0.1428571428571429, 0.0526315789473684, 0.0769230769230769
我想通过将所有元素乘以/除以一个数字来将其转换为整数数组:
v2 = 1729, 4199, 1547, 2261
所有数字也需要以最简单的形式呈现。澄清一下,这是一个自由变量矩阵的解列。我需要让这个变量等于某个东西使得整个列都是整数
我试过很多方法,但似乎没有一种方法一直有效。
我需要某种类型的算法,这样我就可以自动化这个过程。
根据您对另一个答案的评论,您的问题似乎是如何缩放向量,以便所有值都是整数。
这不是一件容易的事,因为你本质上需要找到v1
中所有数字的分数近似值。
相关:找到两个浮点数之比的算法?
基本上有两种主要的方法来做到这一点,这取决于你想要什么样的数字:
1) 简单的方法:你可以把向量乘以2,直到所有的都变成整数。这是肯定会发生的,因为所有当前系统都使用二进制浮点数。这是上述问题的第一个答案。
这种方法有一个主要缺点。如果你的数字是:
0.3333333333333333
0.1000000000000000
0.2500000000000000
你会得到非常"奇怪"(可能很大)的结果。(你不会得到:20, 6, 15
,这是你想要的答案)
2) 困难的方法:这种方法是在v1
的每个元素上使用连分数,将其转换为分数数组。然后将每个元素乘以所有分母的LCM。这是上述问题的第二个答案。
这种方法的缺点是它是数学密集和复杂的。所以你最好复制答案中的实现。优点是效果更好。
如果我理解正确的话,你想做一些可能会导致非常非常大的整数的事情。
你想找到一个整数(最好是最小的,但可能不是很快找到),它是3.3837475943的倍数,称之为m1。然后做同样的事情,得到m1 m2 m3 m4。然后你想找到它们的最小公倍数lcm(m1, m2, m3, m4)
或者只使用m1*m2*m3*m4
来避免计算lcm。然后乘以向量v1,乘以结果。这将导致vector中的巨大整数(几乎总是而不是能够存储在64位)。
对于上面的数字,你可以选择:
m1 = 33837475943
m2 = 89391713934747847847
m3 = 23282781272732734
m4 = 32838723
m = m1*m2*m3*m4 //2312684250534946337531905217893260302519969924182717722
v2 = m*v1
你可能想用快速傅里叶变换来乘m因为它们非常大你可以用O(n log(n))
来代替n²
,但我不知道这些数字是否大到足以让它真正有用