我有以下代码片段:
use num_bigint::*; // 0.2.2
use num_traits::*; // 0.2.8
use std::ops::*;
fn xgcd(b: &BigInt, a: &BigInt) -> (BigInt, BigInt, BigInt) {
let mut x0: BigInt = One::one();
let mut x1: BigInt = Zero::zero();
let mut y0: BigInt = Zero::zero();
let mut y1: BigInt = One::one();
let mut q = 0;
while a != Zero::zero() {
q = b.div(a);
b = a;
a = &b.rem(a);
x0 = x1;
x1 = x0 - q * x1;
y0 = y1;
y1 = y0 - q * y1;
}
return (*b, x0, y0);
}
Run Code Online (Sandbox Code Playgroud)
它给出以下错误:
use num_bigint::*; // 0.2.2
use num_traits::*; // 0.2.8
use std::ops::*;
fn xgcd(b: &BigInt, a: &BigInt) -> (BigInt, BigInt, BigInt) {
let mut x0: BigInt = One::one();
let mut x1: BigInt = Zero::zero();
let mut y0: BigInt = Zero::zero();
let mut y1: BigInt = One::one();
let mut q = 0;
while a != Zero::zero() {
q = b.div(a);
b = a;
a = &b.rem(a);
x0 = x1;
x1 = x0 - q * x1;
y0 = y1;
y1 = y0 - q * y1;
}
return (*b, x0, y0);
}
Run Code Online (Sandbox Code Playgroud)
我查看了的文档,num::BigInt它指出实际上存在一个div带有a BigInt作为参数的方法,但是以某种方式,编译器决定不使用它,而是告诉我不能将a BigInt与a 相除BigInt。有没有什么办法解决这一问题?
而是告诉我,我不能分割
BigInt使用BigInt
它不是。它告诉您,将两者相除的结果是a BigInt,并且需要a {integer}。这是因为您的q变量已声明为整数,而不是BigInt。因此,除法的结果必须是某种内置整数({integer}),但分割的结果BigInt通过一个BigInt是另一个BigInt。
您Zero::zero在其他地方都使用过,所以不清楚为什么不在这里使用。幸运的是,您无需对其进行任何设置,因为无论如何,直到循环内您才应对其进行初始化:
use num_bigint::*; // 0.2.2
use num_traits::*; // 0.2.8
fn xgcd(b: &BigInt, a: &BigInt) -> (BigInt, BigInt, BigInt) {
let mut a = a.clone();
let mut b = b.clone();
let mut x0 = BigInt::one();
let mut x1 = BigInt::zero();
let mut y0 = BigInt::zero();
let mut y1 = BigInt::one();
while !a.is_zero() {
let q = &b / &a;
b = a.clone();
a = &b % &a;
x0 = x1.clone();
x1 = &x0 - &q * x1;
y0 = y1.clone();
y1 = &y0 - &q * y1;
}
(b, x0, y0)
}
Run Code Online (Sandbox Code Playgroud)
更改包括:
/vs div)。.clone()电话增加了。我不能确保这些是尽可能少的克隆数,因此请检查一下。&为了防止在其他地方克隆,添加了许多。Zero::is_zero 比创建和比较值更快。BigInt::zero()。也可以看看: