- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在等式 a + bx = c + dy
中,所有变量都是整数。 a
、b
、c
和 d
是已知的。如何找到 x
和 y
的积分解?如果我的想法是正确的,将有无限多的解决方案,由 b
和 d
的最小公倍数分隔,但我只需要一个解决方案,并且我可以计算其余部分。这是一个例子:
a = 2
b = 3
c = 4
d = 5
a + bx: (2, 5, 8, 11, 14)
c + dy: (4, 9, 14, 19, 24)
a + bx intersects c + dy at 14, so:
x = 4
y = 2
现在,我正在遍历 x
的整数值,直到找到 y
的整数值(伪代码):
function integral_solution(int a, int b, int c, int d) {
// a + bx == c + dy
// (a + bx - c) / d == y
// Some parameters may have no integral solution,
// for example if b == d and (a - c) % b != 0
// If we don't have a solution before x == d, there is none.
int x = 0;
while (x < d)
{
if ((a + bx - c) % d == 0)
{
return [x, (a + bx - c) / d];
}
x++;
}
return false;
}
我觉得有更好的方法来做到这一点。有什么办法不用循环就可以找到 x 和 y 吗?我正在使用 C++,如果这很重要的话。
最佳答案
Linear Diophantine方程采用 ax + by = c
的形式。如果 c
是 a
和 b
的最大公约数,这意味着 a=z'c
和 b=z''c
那么这是 Bézout's identity形式的
a=z'
和 b=z''
方程有无限多解。因此,除了尝试搜索方法之外,您还可以检查c
是否是a
和b 的最大公约数 (GCD)
(在您的情况下,这转化为 bx - dy = c - a
)
如果 a
和 b
确实是 c
的倍数,那么 x
和 y
可以使用 extended Euclidean algorithm 计算它找到满足 Bézout 身份的整数 x
和 y
(其中一个通常为负数)
你的答案是:
a = k*x
,b = k*y
,c - a = k * gcd(a,b)
对于任何整数 k。
(作为旁注:这也适用于任何其他 Euclidean domain ,即多项式环和每个欧几里德域都是 unique factorization domain )。您可以使用迭代法找到这些解决方案:
通过对同类项进行展开分组的常规代数运算(引用前文wikipedia article的最后一节),迭代法得到如下算法:
伪代码:
function extended_gcd(a, b)
x := 0 lastx := 1
y := 1 lasty := 0
while b ≠ 0
quotient := a div b
(a, b) := (b, a mod b)
(x, lastx) := (lastx - quotient*x, x)
(y, lasty) := (lasty - quotient*y, y)
return (lastx, lasty)
因此我编写了示例算法,该算法使用欧几里德算法 迭代方法计算最大公约数 非负a
和b
(对于负值 - these 需要额外的步骤),它返回 GCD 并将 x
和 y
的解决方案存储在通过引用传递给它的变量中:
int gcd_iterative(int a, int b, int& x, int& y) {
int c;
std::vector<int> r, q, x_coeff, y_coeff;
x_coeff.push_back(1); y_coeff.push_back(0);
x_coeff.push_back(0); y_coeff.push_back(1);
if ( b == 0 ) return a;
while ( b != 0 ) {
c = b;
q.push_back(a/b);
r.push_back(b = a % b);
a = c;
x_coeff.push_back( *(x_coeff.end()-2) -(q.back())*x_coeff.back());
y_coeff.push_back( *(y_coeff.end()-2) -(q.back())*y_coeff.back());
}
if(r.size()==1) {
x = x_coeff.back();
y = y_coeff.back();
} else {
x = *(x_coeff.end()-2);
y = *(y_coeff.end()-2);
}
std::vector<int>::iterator it;
std::cout << "r: ";
for(it = r.begin(); it != r.end(); it++) { std::cout << *it << "," ; }
std::cout << "\nq: ";
for(it = q.begin(); it != q.end(); it++) { std::cout << *it << "," ; }
std::cout << "\nx: ";
for(it = x_coeff.begin(); it != x_coeff.end(); it++){ std::cout << *it<<",";}
std::cout << "\ny: ";
for(it = y_coeff.begin(); it != y_coeff.end(); it++){ std::cout << *it<<",";}
return a;
}
通过传递给它一个 example从维基百科 a = 120
和 b = 23
我们得到:
int main(int argc, char** argv) {
// 120x + 23y = gcd(120,23)
int x_solution, y_solution;
int greatestCommonDivisor = gcd_iterative(120, 23, x_solution, y_solution);
return 0;
}
r: 5,3,2,1,0,
q: 5,4,1,1,2,
x: 1,0,1,-4,5,-9,23,
y: 0,1,-5,21,-26,47,-120,
根据这个例子给定的表格是什么:
关于c++ - 方程 `a + bx = c + dy` 的积分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19338633/
我正在用 raphael 和它生成的 SVG 创建一个图像 for paper.text()添加 其中“数字”是基于 Attr(font-size:n) 的数字 有人可以告诉我这个数字是如何计算的,因
任何人都可以向我推荐一种在 css 中获取 dx dy svg 属性的最佳实践方法。如果这不可能,我该如何在 JS 中完成。 最佳答案 通过js,我建议dom节点getAttribute方法: var
使用 Apache-POI,我尝试在 Excel 工作表中插入一张图像,该图像的左上角位于行的中间,并带有大字体 (Calibri-32)。 使用众所周知的公式,我发现 XSSFClientAncho
目标是垂直和水平对齐一组 tspan 元素。 但是,父容器不考虑 dy 值。 这会导致对齐问题。 如果您使用此 Codepen 的 dy 值,文本容器高度始终保持不变:https://codepen.
这是我在 Canvas 上移动文本的代码: paper .text(self.x, self.y, "Jeaaaaaaaaaaaaaaah") .attr({ fill:
我有一个协调器布局,其中包含水平回收器 View 的垂直回收器 View 。 我定义了一个 CoordinatorLayout.Behavior,它使用 onNestedScroll 根据 dyCon
这让我很困惑。我正在尝试使用我的 d3 图表上的“dy”属性将标签与此水平条形图上的刻度对齐。 文档说: The dy attribute indicates a shift along the y-
根据以下文档https://developer.android.com/reference/android/support/v7/widget/RecyclerView.OnScrollListene
我正在研究 svg图片,我想出了一个问题 dy我的 text 的属性标记被忽略。这是一个例子
你好,我正在制作一个 3D 游戏,现在我已经开始制作一些让用户与鼠标交互的东西,我有点卡住了(真的卡住了)。我想做的是,当用户移动鼠标时,它会移回到中心(或者是我输入的坐标),而不影响 Mouse.g
我正在研究使用 plotly 来替换我目前在 matplotlib 中做的一些图表。 我需要控制一个条形图,使每个条形的底部和顶部以任意值开始和结束。 在 matplotlib 中,这是相当简单的:
在等式 a + bx = c + dy 中,所有变量都是整数。 a、b、c 和 d 是已知的。如何找到 x 和 y 的积分解?如果我的想法是正确的,将有无限多的解决方案,由 b 和 d 的最小公倍
我们如何在 dip 中指定 TextView 的 shadowDx/Dy/Radius 值?现在我有: -1 -1 1 我似乎无法在这些地方指定“1dip”。除了在代码中设置它们并自己
我有以下示例 svg: Foo // this is completely ignored Bar // this is positioned 10 units below not
我正在研究一个简单的模型,其中包括 dy/dx 的导数,但在 Modelica 中,我无法直接编写这个方程,我可以使用 x=time 和 der(y),但我认为这是一个折衷方案,因为 Modelica
导出 SVG 文件并在 Corel Draw(某些旧版本)中打开它时,我遇到了文本元素位置问题。我通过将每个 dx/dy 属性设置为零并将其值添加到相应的 x/y 属性来修复此问题。 我编写了一个辅助
我是 d3js 的初学者,正在尝试让一个非常简单的径向整齐树工作。 我写了下面一段代码来生成一棵树。 139 function radialTree(window, svg, data) { 140
在下面的代码中,预计我的鼠标光标将在屏幕上设置为 (100,100)。然而,结果光标移动到了 (2,1)。 当未设置 MOUSEEVENTF_ABSOLUTE 时,我预计鼠标会分别向右和底部移动 10
我正在尝试为 dy>dx 编写一个 bresenhams 程序。我们的老师告诉我们用 C++ 编写 bresenhans 画线程序,它将满足所有可能的条件,她认为我们通过提供此公式的 来为 dx>dy
我正在阅读 GObject/acm.graphics 的 Java 文档。 我正在看这个方法: move(double dx, double dy) 使用位移 dx 和 dy 在屏幕上移动对象。 我想
我是一名优秀的程序员,十分优秀!