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

时间:2022-01-14 17:36:59
对于一个线形函数:
   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点结帐。

#2


p=a
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对应即得

#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;

}

#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>

/*&Aring;·&frac14;&cedil;&Agrave;&iuml;&micro;&Acirc;&Euml;&atilde;·¨&Ntilde;&Uuml;&Eacute;ú&pound;&not;&Ccedil;ó&frac12;&acirc;&Iacute;&not;&Oacute;à·&frac12;&sup3;&Igrave;;*/
/* 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<<"&Iacute;¨&frac12;&acirc;&Icirc;&ordf;&pound;&ordm;\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点结帐。

#2


p=a
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对应即得

#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;

}

#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>

/*&Aring;·&frac14;&cedil;&Agrave;&iuml;&micro;&Acirc;&Euml;&atilde;·¨&Ntilde;&Uuml;&Eacute;ú&pound;&not;&Ccedil;ó&frac12;&acirc;&Iacute;&not;&Oacute;à·&frac12;&sup3;&Igrave;;*/
/* 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<<"&Iacute;¨&frac12;&acirc;&Icirc;&ordf;&pound;&ordm;\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的取值必须确定一个范围才能求出。在这里就只好取默认了。