了解向量乘法
Understanding vector multiplication
我必须在 c++ 中使用向量执行乘法,因此例如,要将数字 123 和 528 相乘,我必须将每个数字存储在向量中并将它们相乘。我的导师提供了乘法算法。下一段的第一行可能看起来有点令人困惑,但我想让你知道,我只是在重载运算符*以使用向量在两个数字之间执行乘法。
ubigint::operator* 中的乘法通过分配一个新向量进行,该向量的大小等于其他两个操作数的大小之和。如果你是大小为 m 的向量,而 v 是大小为 n 的向量,则在 O(mn(speed 中,在一个参数上执行一个外循环,在另一个参数上执行一个内循环,像手动一样将新的部分积添加到乘积 p 中。该算法可以用数学方式描述如下:
p ←Φ
for i ∈ [0, m):
c ← 0
for j ∈ [0, n):
d ← p_{i+ j} + u_iv_j + c
p_{i+ j} ← d % 10
c ← ceil(d÷10)
p_{i+n} ← c
请注意,区间 [a,b( 是指集合 {x|a ≤ x
问题是我不明白这个算法是如何工作的。例如,什么是u_iv_j?谁能澄清这一点?
将您的算法视为对大数相乘的正式描述:
for i ∈ [0, m): # For every digit of the first number
c ← 0 # Initialize the carry
for j ∈ [0, n): # For every digit of the second number
d ← p_{i+j} + u_i * v_j + c # Compute the product of the digits + carry + previous result
p_{i+j} ← d % 10 # extract the lowest digit and store it
c ← ceil(d÷10) # carry the higher digits
p_{i+n} ← c # In the end, store the carry in the
# highest, not yet used digit
我省略了一些细节(操作顺序,...(,但如有必要,我可以添加它们。
编辑:为了澄清我的意思,我将展示代码对56 * 12的作用:p
初始化为 0
i = 0: # Calculate 6 * 12
carry = 0
j = 0: # Calculate 6 * 2
d = p{0} + 6 * 2 + carry # == 0 + 12 + 0
p{0} = d % 10 # == 2
carry = ceil(d/10) # == 1
j = 1: # Calculate 6 * 1 + carry
d = p{0} + 6 * 1 + carry # == 0 + 6 + 1
p{1} = d % 10 # == 7
carry = ceil(d/10) # == 0
p{2} = carry # == 0
i = 1: # Calculate 5 * 12
carry = 0
j = 0: # Calculate 5 * 2
d = p{1} + 5 * 2 + carry # == 7 + 10 + 0
p{1} = d % 10 # == 7
carry = ceil(d/10) # == 1
j = 1: # Calculate 5 * 1
d = p{2} + 5 * 1 + carry # == 0 + 5 + 1
p{2} = d % 10 # == 6
carry = ceil(d/10) # == 0
p{3} = carry # == 0
对于 i = 0,我们计算 6 * 12 =72,对于 i = 1,我们计算 5 * 12 = 60。
由于 5 在第二个数字中,我们实际上计算了 50 * 12 = 600。现在我们需要添加结果(即 72 + 600(,这就是为什么我提到之前的值:第一次运行循环后,72 存储在p
中,要添加 600,我们只需将本地产品u_i * v_j
添加到p{i+j}
中的现有值,同时保留进位。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 正在尝试了解输入验证循环
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 了解 GLM- openGL 中的相机转换
- 了解向量中的 .begin 和 .end
- 了解向量乘法
- C :尝试了解向量和类
- 了解C 中的向量初始化
- 了解C 中的地图和向量的TypeId.name()输出
- 了解我有多少内存可用于一个动态向量c++
- 了解对象向量的Next_Permutation函数C++