搜寻互质点中的空白
在趣题妙解板块《由互质点织成的一块布》一贴中的第二问,mathe给出了漂亮的结论以及巧妙的构造:http://bbs.emath.ac.cn/thread-1946-2-1.html
为此特意摆设一个编程擂台,对于n=2、n=3、n=4的情况,找对应的(x,y),使得整数对
(x,y),(x+1,y),...,(x+n-1,y)
(x,y+1),(x+1,y+1),...,(x+n-1,y+1)
............
(x,y+n-1),(x+1,y+n-1),...,(x+n-1,y+n-1)
均不互质。
在满足上面的条件的前提下,(x+y)的值越小越好。
看看对于n=2、n=3、n=4的情况,找出来的整数对到底有多大。 N=2: (14,20) N=3: (1274 ,1308) 这个问题的计算很费时啊,有谁能给出N=4,5,6,7,8,9,10
的值呢??
可能需要借助数论知识来编程,缩短运算时间,有谁能给出答案及程序??? N=4我们可以试着搜索公因子模式如下的结构,其中?用互素而且不小于5的素数。
6 ?2 3
? ?? ?
2 ?2 ?
3 ?? 3 Found x=2038235252988,y=2891651852154
Found x=721235275761,y=383376261639
Found x=329601462366,y=322399219389
Found x=8197745490,y=507009915048
Found x=8197745490,y=41984229963
Found x=3333736029,y=394313397
Found x=1668280158,y=642103992
Found x=939158010,y=770462691
// gcds.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <algorithm>
#include <assert.h>
using namespace std;
#define ASSERT(x) assert(x)
int primes[]={5,7,11,13,19,23,29,31,37,41,43};
int cand;
int buf;
long long minr=-1;
long long mx, my;
long long gcd(long long x, long long y)
{
if(y==0)return x;
do{
long long r=x%y;
x=y;y=r;
}while(y!=0);
return x;
}
long long extGCD(long long a, long long b, long long & ar, long long & br)
{
long long x = 0, y = 1;
long long old_a=a,old_b=b;
ar = 1, br = 0;
unsigned long long t, q;
while (b != 0)
{
t = b; q = a / b; b = a % b; a = t;
t = x; x = ar - q * x; ar = t;
t = y; y = br - q * y; br = t;
}
if(ar<0)ar+=old_b;
if(br<0)br+=old_a;
return (a);
}
long long lcm(long long x, long long y)
{
return x/gcd(x,y)*y;
}
long long chinese(long long c)
{
long long s,t;
long long d1=extGCD(c,c,s,t);
ASSERT(d1==1);
if(s!=0)s=c-s;
long long m1=c*c;
long long r1=c*s;
d1=extGCD(c,c,s,t);
ASSERT(d1==1);
long long a,b;
a=((c-3)*s)%c;
b=((c-2)*t)%c;
long long m2=c*c;
long long r2=(a*c+b*c)%m2;
d1=extGCD(m1,m2,s,t);
ASSERT((r2-r1)%d1==0);
b=(r1*t)%m1;
a=(r2*s)%m2;
long long d2=gcd(d1,r1);
m1/=d1;
m2/=d2;
d1/=d2;
r1%=m1;r2%=m2;
d1=extGCD(m1,m2,s,t);
ASSERT(d1==1);
a=(r1*t)%m1;
b=(r2*s)%m2;
long long r3=(a*m2+b*m1)%(m1*m2);
return lcm(r3,d2);
}
void test_buf()
{
long long c;
int i;
for(i=0;i<4;i++){
long long l1=lcm(buf,buf);
long long l2=lcm(buf,buf);
c=lcm(l1,l2);
}
long long x=chinese(c);
for(i=0;i<4;i++){
long long l1=lcm(buf,buf);
long long l2=lcm(buf,buf);
c=lcm(l1,l2);
}
long long y=chinese(c);
if(minr<0||minr>x+y){
minr=x+y;
mx=x;
my=y;
printf("Found x=%lld,y=%lld\n",mx,my);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i,j,k,t;
for(i=0;i<11;i++)for(j=i+1;j<11;j++){
for(k=0,t=0;k<11;k++){
if(k!=i&&k!=j){
cand=primes;
}
}
do{
buf=6;buf=cand;buf=2;buf=3;
buf=cand;buf=cand;buf=cand;buf=cand;
buf=2;buf=cand;buf=2;buf=cand;
buf=3;buf=cand;buf=cand;buf=3;
test_buf();
buf=3;buf=2;buf=cand;buf=6;
buf=cand;buf=cand;buf=cand;buf=cand;
buf=cand;buf=2;buf=cand;buf=2;
buf=3;buf=cand;buf=cand;buf=3;
test_buf();
buf=3;buf=cand;buf=cand;buf=3;
buf=cand;buf=2;buf=cand;buf=2;
buf=cand;buf=cand;buf=cand;buf=cand;
buf=3;buf=2;buf=cand;buf=6;
test_buf();
buf=3;buf=cand;buf=cand;buf=3;
buf=2;buf=cand;buf=2;buf=cand;
buf=cand;buf=cand;buf=cand;buf=cand;
buf=6;buf=cand;buf=2;buf=3;
test_buf();
}while(next_permutation(cand,cand+9));
}
return 0;
}
上面的程序我还没有运行完毕,谁来运行一下看看? 请问:mathe
需要下载什么程序可以运行你写的程序呢?
因为我用的是matlabR2009 一个更优的解:x=726156780,y=68838054