ax + by + c = 0
如何转换成为这样的参数表达式
x = mk + n
y = pk + q
其中 a, b, c, m, n, p, q 都是整数k是参数
例如:
5y - 3x -1 = 0
可以化解成为:
x = 5k + 3
y = 3k + 2
10 个解决方案
#1
送分的题呀。
没人要?
自己顶!
明天17点结帐。
没人要?
自己顶!
明天17点结帐。
#2
p=a
m=-b
n和q只要满足an+bq+c=0即可
m=-b
n和q只要满足an+bq+c=0即可
#3
整数规划吗?
#4
求解过程是将 x = mk + n和 y = pk + q变形得,k=(x-n)/m,k=(y-q)/p,两式相等,所以
(x-n)/m=(y-q)/p
整理之后为px-my+(mq-pn)=0与a,b,c对应即得
(x-n)/m=(y-q)/p
整理之后为px-my+(mq-pn)=0与a,b,c对应即得
#5
要用你的方法验证前面给出的例子,不符合的不算对哦
#6
将x = mk + n
y = pk + q
代入:
ax + by + c = 0 中有:
(am+bp)k+(an+bq+c)=0
比较系数有:
am+bp=0
an+bq+c=0
对于m,p,只要取m=b, p=-a 就可以了
对于n,q,需要用到求解模线性方程的知识。
下面是偶写的C++程序,在VC++6.0环境下运行,
里面用到了前任斑竹海星的数论算法库,其中偶做了点修改。
#include <iostream>
using namespace std;
/*********************************************
扩展欧几里德算法求gcd(a,b)=ax+by
copyright starfish
2000/10/24
*********************************************/
//extended euclid algorithm to calculate the gcd(a,b),
//as well as the integer x and y where gcd(a,b)=a*x+b*y
int ext_euclid(int a,int b,int &x,int &y)
{
int t,d;
if (b==0) {x=1;y=0;return a;}
d=ext_euclid(b,a %b,x,y);
t=x;
x=y;
y=t-a/b*y;
return d;
}
/********************************************
求解模线性方程 ax=b (mod n) ,n>0
//copyright starfish
//modified by dcyu
//re返回第一个x解
*********************************************/
void modular_linear_equation_solver(int a,int b,int n,int &re)
{
int e,d;
int x,y;
d=ext_euclid(a,n,x,y);
if (b%d!=0) { cout<<"No answer!"<<endl; exit(1); }
else
{ e=(x*(b/d))%n;
// for (i=0;i<d;i++) //notice! here x maybe <0
// printf("The %dth answer is : %ld\n",i+1,(e+i*(n/d))%n);
re=e%n;
}
}
int main()
{
int a, b, c, m, n, p, q;
cin>>a>>b>>c;
m=b;
p=-a;
if(a!=0&&b!=0)
{
modular_linear_equation_solver(a, -c, b, n);
q=-(a*n+c)/b;
}
else if(a==0&&b!=0)
{
n=1; //其实随便什么数都行
if(c%b==0)
q=-c/b;
else { cout<<"No answer!"<<endl; exit(1); }
}
else if(a!=0&&b==0)
{
q=1; //其实随便什么数都行
if(c%a==0)
q=-c/a;
else { cout<<"No answer!"<<endl; exit(1); }
}
else
{
if(!c) { n=1; q=1; } //其实随便什么数都行
else { cout<<"No answer!"<<endl; exit(1); }
}
cout<<"m="<<m<<" "<<"p="<<p<<endl;
cout<<"n="<<n<<" "<<"q="<<q<<endl;
return 0;
}
y = pk + q
代入:
ax + by + c = 0 中有:
(am+bp)k+(an+bq+c)=0
比较系数有:
am+bp=0
an+bq+c=0
对于m,p,只要取m=b, p=-a 就可以了
对于n,q,需要用到求解模线性方程的知识。
下面是偶写的C++程序,在VC++6.0环境下运行,
里面用到了前任斑竹海星的数论算法库,其中偶做了点修改。
#include <iostream>
using namespace std;
/*********************************************
扩展欧几里德算法求gcd(a,b)=ax+by
copyright starfish
2000/10/24
*********************************************/
//extended euclid algorithm to calculate the gcd(a,b),
//as well as the integer x and y where gcd(a,b)=a*x+b*y
int ext_euclid(int a,int b,int &x,int &y)
{
int t,d;
if (b==0) {x=1;y=0;return a;}
d=ext_euclid(b,a %b,x,y);
t=x;
x=y;
y=t-a/b*y;
return d;
}
/********************************************
求解模线性方程 ax=b (mod n) ,n>0
//copyright starfish
//modified by dcyu
//re返回第一个x解
*********************************************/
void modular_linear_equation_solver(int a,int b,int n,int &re)
{
int e,d;
int x,y;
d=ext_euclid(a,n,x,y);
if (b%d!=0) { cout<<"No answer!"<<endl; exit(1); }
else
{ e=(x*(b/d))%n;
// for (i=0;i<d;i++) //notice! here x maybe <0
// printf("The %dth answer is : %ld\n",i+1,(e+i*(n/d))%n);
re=e%n;
}
}
int main()
{
int a, b, c, m, n, p, q;
cin>>a>>b>>c;
m=b;
p=-a;
if(a!=0&&b!=0)
{
modular_linear_equation_solver(a, -c, b, n);
q=-(a*n+c)/b;
}
else if(a==0&&b!=0)
{
n=1; //其实随便什么数都行
if(c%b==0)
q=-c/b;
else { cout<<"No answer!"<<endl; exit(1); }
}
else if(a!=0&&b==0)
{
q=1; //其实随便什么数都行
if(c%a==0)
q=-c/a;
else { cout<<"No answer!"<<endl; exit(1); }
}
else
{
if(!c) { n=1; q=1; } //其实随便什么数都行
else { cout<<"No answer!"<<endl; exit(1); }
}
cout<<"m="<<m<<" "<<"p="<<p<<endl;
cout<<"n="<<n<<" "<<"q="<<q<<endl;
return 0;
}
#7
X随便设一个x = mk + n(m,n为具体的数,m不为0),然后把它代如原式ax + by + c = 0,就可以解出y = pk + q了
#8
上面是没有考虑a,b为0的,确切一点应该是:若b不为0,则x随便设一个x = mk + n(m,n为具体的数,m不为0),然后把它代如原式ax + by + c = 0,就可以解出y = pk + q了,若b不为0,则y随便设一个y = pk + q(p,q为具体的数,p不为0),然后把它代如原式ax + by + c = 0,就可以解出了x = mk + n,
#9
to:HUNTON()
这样解不能保证系数为整数
这样解不能保证系数为整数
#10
呵呵,想法差不多。
我的解法如下:
将 x,y代入等式,由于对任意整数k成立,有:
a*m+b*q=0;
a*n+b*q+c=0;
从而只要解线性同余式就可以,将(m,n)作为通解,(n,q)作为特解.
求解算法如下:(由Euclid算法衍生出来,详见实用算法的分析与程序设计)
#include<iostream.h>
/*Å·¼¸ÀïµÂËã·¨ÑÜÉú£¬Çó½âͬÓà·½³Ì;*/
/* d=gcd(a,b)=ax+by */
long extend_Enclid(long a,long b,long &x,long &y)
{
long temp1,temp2;
if ( b==0)
{
x=1;
y=0;
return a;
}
else
{
temp1=extend_Enclid(b,a%b,x,y);
temp2=x;
x=y;
y=temp2-(a/b)*y;
return temp1;
}
}
void main()
{
long a,b,c,d,x,y,m,n,p,q;
cin>>a>>b>>c;
d=extend_Enclid(a,b,x,y);
m=-b/d;
p=a/d;
n=x*(-1)*c/d;
q=y*(-1)*c/d;
cout<<"ͨ½âΪ£º\n"
<<"X="<<m<<"K";
if(n>0)
cout<<"+"<<n<<endl;
else if (n==0)
cout<<endl;
else
cout<<n<<endl;
cout<<"Y="<<p<<"K";
if(q>0)
cout<<"+"<<q<<endl;
else if (q==0)
cout<<endl;
else
cout<<q<<endl;
}
具体n,q的取值必须确定一个范围才能求出。在这里就只好取默认了。
我的解法如下:
将 x,y代入等式,由于对任意整数k成立,有:
a*m+b*q=0;
a*n+b*q+c=0;
从而只要解线性同余式就可以,将(m,n)作为通解,(n,q)作为特解.
求解算法如下:(由Euclid算法衍生出来,详见实用算法的分析与程序设计)
#include<iostream.h>
/*Å·¼¸ÀïµÂËã·¨ÑÜÉú£¬Çó½âͬÓà·½³Ì;*/
/* d=gcd(a,b)=ax+by */
long extend_Enclid(long a,long b,long &x,long &y)
{
long temp1,temp2;
if ( b==0)
{
x=1;
y=0;
return a;
}
else
{
temp1=extend_Enclid(b,a%b,x,y);
temp2=x;
x=y;
y=temp2-(a/b)*y;
return temp1;
}
}
void main()
{
long a,b,c,d,x,y,m,n,p,q;
cin>>a>>b>>c;
d=extend_Enclid(a,b,x,y);
m=-b/d;
p=a/d;
n=x*(-1)*c/d;
q=y*(-1)*c/d;
cout<<"ͨ½âΪ£º\n"
<<"X="<<m<<"K";
if(n>0)
cout<<"+"<<n<<endl;
else if (n==0)
cout<<endl;
else
cout<<n<<endl;
cout<<"Y="<<p<<"K";
if(q>0)
cout<<"+"<<q<<endl;
else if (q==0)
cout<<endl;
else
cout<<q<<endl;
}
具体n,q的取值必须确定一个范围才能求出。在这里就只好取默认了。
#1
送分的题呀。
没人要?
自己顶!
明天17点结帐。
没人要?
自己顶!
明天17点结帐。
#2
p=a
m=-b
n和q只要满足an+bq+c=0即可
m=-b
n和q只要满足an+bq+c=0即可
#3
整数规划吗?
#4
求解过程是将 x = mk + n和 y = pk + q变形得,k=(x-n)/m,k=(y-q)/p,两式相等,所以
(x-n)/m=(y-q)/p
整理之后为px-my+(mq-pn)=0与a,b,c对应即得
(x-n)/m=(y-q)/p
整理之后为px-my+(mq-pn)=0与a,b,c对应即得
#5
要用你的方法验证前面给出的例子,不符合的不算对哦
#6
将x = mk + n
y = pk + q
代入:
ax + by + c = 0 中有:
(am+bp)k+(an+bq+c)=0
比较系数有:
am+bp=0
an+bq+c=0
对于m,p,只要取m=b, p=-a 就可以了
对于n,q,需要用到求解模线性方程的知识。
下面是偶写的C++程序,在VC++6.0环境下运行,
里面用到了前任斑竹海星的数论算法库,其中偶做了点修改。
#include <iostream>
using namespace std;
/*********************************************
扩展欧几里德算法求gcd(a,b)=ax+by
copyright starfish
2000/10/24
*********************************************/
//extended euclid algorithm to calculate the gcd(a,b),
//as well as the integer x and y where gcd(a,b)=a*x+b*y
int ext_euclid(int a,int b,int &x,int &y)
{
int t,d;
if (b==0) {x=1;y=0;return a;}
d=ext_euclid(b,a %b,x,y);
t=x;
x=y;
y=t-a/b*y;
return d;
}
/********************************************
求解模线性方程 ax=b (mod n) ,n>0
//copyright starfish
//modified by dcyu
//re返回第一个x解
*********************************************/
void modular_linear_equation_solver(int a,int b,int n,int &re)
{
int e,d;
int x,y;
d=ext_euclid(a,n,x,y);
if (b%d!=0) { cout<<"No answer!"<<endl; exit(1); }
else
{ e=(x*(b/d))%n;
// for (i=0;i<d;i++) //notice! here x maybe <0
// printf("The %dth answer is : %ld\n",i+1,(e+i*(n/d))%n);
re=e%n;
}
}
int main()
{
int a, b, c, m, n, p, q;
cin>>a>>b>>c;
m=b;
p=-a;
if(a!=0&&b!=0)
{
modular_linear_equation_solver(a, -c, b, n);
q=-(a*n+c)/b;
}
else if(a==0&&b!=0)
{
n=1; //其实随便什么数都行
if(c%b==0)
q=-c/b;
else { cout<<"No answer!"<<endl; exit(1); }
}
else if(a!=0&&b==0)
{
q=1; //其实随便什么数都行
if(c%a==0)
q=-c/a;
else { cout<<"No answer!"<<endl; exit(1); }
}
else
{
if(!c) { n=1; q=1; } //其实随便什么数都行
else { cout<<"No answer!"<<endl; exit(1); }
}
cout<<"m="<<m<<" "<<"p="<<p<<endl;
cout<<"n="<<n<<" "<<"q="<<q<<endl;
return 0;
}
y = pk + q
代入:
ax + by + c = 0 中有:
(am+bp)k+(an+bq+c)=0
比较系数有:
am+bp=0
an+bq+c=0
对于m,p,只要取m=b, p=-a 就可以了
对于n,q,需要用到求解模线性方程的知识。
下面是偶写的C++程序,在VC++6.0环境下运行,
里面用到了前任斑竹海星的数论算法库,其中偶做了点修改。
#include <iostream>
using namespace std;
/*********************************************
扩展欧几里德算法求gcd(a,b)=ax+by
copyright starfish
2000/10/24
*********************************************/
//extended euclid algorithm to calculate the gcd(a,b),
//as well as the integer x and y where gcd(a,b)=a*x+b*y
int ext_euclid(int a,int b,int &x,int &y)
{
int t,d;
if (b==0) {x=1;y=0;return a;}
d=ext_euclid(b,a %b,x,y);
t=x;
x=y;
y=t-a/b*y;
return d;
}
/********************************************
求解模线性方程 ax=b (mod n) ,n>0
//copyright starfish
//modified by dcyu
//re返回第一个x解
*********************************************/
void modular_linear_equation_solver(int a,int b,int n,int &re)
{
int e,d;
int x,y;
d=ext_euclid(a,n,x,y);
if (b%d!=0) { cout<<"No answer!"<<endl; exit(1); }
else
{ e=(x*(b/d))%n;
// for (i=0;i<d;i++) //notice! here x maybe <0
// printf("The %dth answer is : %ld\n",i+1,(e+i*(n/d))%n);
re=e%n;
}
}
int main()
{
int a, b, c, m, n, p, q;
cin>>a>>b>>c;
m=b;
p=-a;
if(a!=0&&b!=0)
{
modular_linear_equation_solver(a, -c, b, n);
q=-(a*n+c)/b;
}
else if(a==0&&b!=0)
{
n=1; //其实随便什么数都行
if(c%b==0)
q=-c/b;
else { cout<<"No answer!"<<endl; exit(1); }
}
else if(a!=0&&b==0)
{
q=1; //其实随便什么数都行
if(c%a==0)
q=-c/a;
else { cout<<"No answer!"<<endl; exit(1); }
}
else
{
if(!c) { n=1; q=1; } //其实随便什么数都行
else { cout<<"No answer!"<<endl; exit(1); }
}
cout<<"m="<<m<<" "<<"p="<<p<<endl;
cout<<"n="<<n<<" "<<"q="<<q<<endl;
return 0;
}
#7
X随便设一个x = mk + n(m,n为具体的数,m不为0),然后把它代如原式ax + by + c = 0,就可以解出y = pk + q了
#8
上面是没有考虑a,b为0的,确切一点应该是:若b不为0,则x随便设一个x = mk + n(m,n为具体的数,m不为0),然后把它代如原式ax + by + c = 0,就可以解出y = pk + q了,若b不为0,则y随便设一个y = pk + q(p,q为具体的数,p不为0),然后把它代如原式ax + by + c = 0,就可以解出了x = mk + n,
#9
to:HUNTON()
这样解不能保证系数为整数
这样解不能保证系数为整数
#10
呵呵,想法差不多。
我的解法如下:
将 x,y代入等式,由于对任意整数k成立,有:
a*m+b*q=0;
a*n+b*q+c=0;
从而只要解线性同余式就可以,将(m,n)作为通解,(n,q)作为特解.
求解算法如下:(由Euclid算法衍生出来,详见实用算法的分析与程序设计)
#include<iostream.h>
/*Å·¼¸ÀïµÂËã·¨ÑÜÉú£¬Çó½âͬÓà·½³Ì;*/
/* d=gcd(a,b)=ax+by */
long extend_Enclid(long a,long b,long &x,long &y)
{
long temp1,temp2;
if ( b==0)
{
x=1;
y=0;
return a;
}
else
{
temp1=extend_Enclid(b,a%b,x,y);
temp2=x;
x=y;
y=temp2-(a/b)*y;
return temp1;
}
}
void main()
{
long a,b,c,d,x,y,m,n,p,q;
cin>>a>>b>>c;
d=extend_Enclid(a,b,x,y);
m=-b/d;
p=a/d;
n=x*(-1)*c/d;
q=y*(-1)*c/d;
cout<<"ͨ½âΪ£º\n"
<<"X="<<m<<"K";
if(n>0)
cout<<"+"<<n<<endl;
else if (n==0)
cout<<endl;
else
cout<<n<<endl;
cout<<"Y="<<p<<"K";
if(q>0)
cout<<"+"<<q<<endl;
else if (q==0)
cout<<endl;
else
cout<<q<<endl;
}
具体n,q的取值必须确定一个范围才能求出。在这里就只好取默认了。
我的解法如下:
将 x,y代入等式,由于对任意整数k成立,有:
a*m+b*q=0;
a*n+b*q+c=0;
从而只要解线性同余式就可以,将(m,n)作为通解,(n,q)作为特解.
求解算法如下:(由Euclid算法衍生出来,详见实用算法的分析与程序设计)
#include<iostream.h>
/*Å·¼¸ÀïµÂËã·¨ÑÜÉú£¬Çó½âͬÓà·½³Ì;*/
/* d=gcd(a,b)=ax+by */
long extend_Enclid(long a,long b,long &x,long &y)
{
long temp1,temp2;
if ( b==0)
{
x=1;
y=0;
return a;
}
else
{
temp1=extend_Enclid(b,a%b,x,y);
temp2=x;
x=y;
y=temp2-(a/b)*y;
return temp1;
}
}
void main()
{
long a,b,c,d,x,y,m,n,p,q;
cin>>a>>b>>c;
d=extend_Enclid(a,b,x,y);
m=-b/d;
p=a/d;
n=x*(-1)*c/d;
q=y*(-1)*c/d;
cout<<"ͨ½âΪ£º\n"
<<"X="<<m<<"K";
if(n>0)
cout<<"+"<<n<<endl;
else if (n==0)
cout<<endl;
else
cout<<n<<endl;
cout<<"Y="<<p<<"K";
if(q>0)
cout<<"+"<<q<<endl;
else if (q==0)
cout<<endl;
else
cout<<q<<endl;
}
具体n,q的取值必须确定一个范围才能求出。在这里就只好取默认了。