一个小问题,可不简单哦!

寻开心 2003-06-05 02:24:12
对于一个线形函数:
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
...全文
32 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
levinjoe 2003-06-05
  • 打赏
  • 举报
回复
呵呵,想法差不多。
我的解法如下:
将 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的取值必须确定一个范围才能求出。在这里就只好取默认了。
KenShin1978 2003-06-05
  • 打赏
  • 举报
回复
to:HUNTON()
这样解不能保证系数为整数
HUNTON 2003-06-05
  • 打赏
  • 举报
回复
上面是没有考虑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,
HUNTON 2003-06-05
  • 打赏
  • 举报
回复
X随便设一个x = mk + n(m,n为具体的数,m不为0),然后把它代如原式ax + by + c = 0,就可以解出y = pk + q了
dcyu 2003-06-05
  • 打赏
  • 举报
回复
将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;

}
寻开心 2003-06-05
  • 打赏
  • 举报
回复
要用你的方法验证前面给出的例子,不符合的不算对哦
KenShin1978 2003-06-05
  • 打赏
  • 举报
回复
求解过程是将 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对应即得
boylez 2003-06-05
  • 打赏
  • 举报
回复
整数规划吗?
KenShin1978 2003-06-05
  • 打赏
  • 举报
回复
p=a
m=-b
n和q只要满足an+bq+c=0即可
寻开心 2003-06-05
  • 打赏
  • 举报
回复
送分的题呀。
没人要?
自己顶!
明天17点结帐。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧