- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 40149
- 在线时间
- 小时
|
楼主 |
发表于 2008-11-4 14:17:24
|
显示全部楼层
再贴一个用gmp程序实现的对应代码,可以用来解出对于给定n的所有基本解或前面若干个解(比如前10000个解)。-
- #include <stdio.h>
- #include <gmp.h>
- #include <math.h>
- #include <set>
- using namespace std;
- #ifndef N
- #define N 4
- #endif
- #define MAX_COUNT 10000
- typedef struct sDataEntry{
- mpz_t datas[N];
- mpz_t nc;
- sDataEntry(){
- int i;
- for(i=0;i<N;i++)mpz_init(datas[i]);
- mpz_init(nc);
- }
- sDataEntry(const sDataEntry& d){
- int i;
- for(i=0;i<N;i++)mpz_init(datas[i]);
- mpz_init(nc);
- for(i=0;i<N;i++){
- mpz_set(datas[i],d.datas[i]);
- }
- mpz_set(nc,d.nc);
- }
- ~sDataEntry(){
- int i;
- for(i=0;i<N;i++)mpz_clear(datas[i]);
- mpz_clear(nc);
- }
- void set_nc(){
- int i;
- mpz_t tmp;
- mpz_init(tmp);
- mpz_set_ui(nc,0);
- for(i=0;i<N;i++){
- mpz_mul(tmp,datas[i],datas[i]);
- mpz_add(nc,nc,tmp);
- }
- mpz_clear(tmp);
- }
- bool operator<(const struct sDataEntry& s)const{
- int i;
- int c=mpz_cmp(nc,s.nc);
- if(c!=0)return c<0;
- for(i=N-1;i>=0;i--){
- int c=mpz_cmp(datas[i],s.datas[i]);
- if(c!=0)return c<0;
- }
- return false;
- }
- bool operator==(const struct sDataEntry& s)const{
- int i;
- for(i=N-1;i>=0;i--){
- int c=mpz_cmp(datas[i],s.datas[i]);
- if(c!=0)return false;
- }
- return true;
- }
- }DataEntry;
-
- set<DataEntry> results;
-
- DataEntry t;
- int td[N];
- void search_last()
- {
- long long mul=1LL;
- long long sum=0LL;
- int i;
- if(td[N-3]==1)return;///No solution available
- for(i=0;i<N-2;i++){
- mul*=td[i];
- sum+=(long long)td[i]*td[i];
- }
- if(mul<=2LL)return;///No solution available;
- long long d=sum/(mul-2LL);
- int up=(int)sqrt(d+0.01);
- for(i=td[N-3];i<=up;i++){
- td[N-2]=i;
- long long a=sum+(long long)i*i;
- long long b=mul*i;
- long long c=b*b-4*a;
- if(c<0)continue;
- int u=(int)sqrt((double)c);
- if(u*(long long)u<c)u=u+1;
- if(u*(long long)u==c){///Found a solution now
- if((b-u)&1)continue;///Invalid
- td[N-1]=(int)((b-u)/2);
- int j;
- for(j=0;j<N;j++){
- mpz_set_ui(t.datas[j],td[j]);
- }
- t.set_nc();
- results.insert(t);
- }
- }
- }
-
- void search(int last)
- {
- int i;
- if(last==N-2){
- search_last();
- return;
- }
- long long mul=1LL;
- long long mul2;
- double ub;
- for(i=0;i<last;i++){
- mul*=td[i];
- }
- if(mul>N)return;
- ub=pow((double)N/(double)mul,1.0/(N-2-last))+0.01;
- i=1;if(last>0)i=td[last-1];
- for(;i<=(int)ub;i++){
- td[last]=i;
- search(last+1);
- }
- }
- int tcount=0;
- void dump(const DataEntry& d)
- {
- int i;
- for(i=0;i<N;i++){
- mpz_out_str(stdout,10,d.datas[i]);
- printf("\t");
- }
- printf("\n");
- }
-
- void dumpall()
- {
- set<DataEntry>::iterator it;
- for(it=results.begin();it!=results.end();++it){
- dump(*it);
- }
- }
-
- bool gens(const DataEntry& d)///return false when tcount reaches MAX_COUNT
- {
- mpz_t sum;
- mpz_t tmp;
- mpz_init(sum);mpz_init(tmp);
- int i,j;
- mpz_set_ui(sum,0);
- for(i=0;i<N;i++){
- mpz_mul(tmp,d.datas[i],d.datas[i]);
- mpz_add(sum,sum,tmp);
- }
- for(i=0;i<N;i++){
- if(i>0&&mpz_cmp(d.datas[i],d.datas[i-1])==0)
- continue;
- mpz_mul(tmp,d.datas[i],d.datas[i]);
- mpz_sub(tmp,sum,tmp);
- mpz_div(tmp,tmp,d.datas[i]);
- if(mpz_cmp(tmp,d.datas[N-1])>0){
- for(j=0;j<i;j++){
- mpz_set(t.datas[j],d.datas[j]);
- }
- for(j=i;j<N-1;j++){
- mpz_set(t.datas[j],d.datas[j+1]);
- }
- mpz_set(t.datas[j],tmp);
- t.set_nc();
- set<DataEntry>::iterator lit;
- lit=results.find(t);
- if(lit==results.end()){
- results.insert(t);
- tcount++;
- }
- }
- }
- mpz_clear(sum);mpz_clear(tmp);
- return tcount<MAX_COUNT;
- }
-
- void gen_more()
- {
- set<DataEntry>::iterator it;
- for(it=results.begin();it!=results.end();++it){
- if(!gens(*it))
- break;
- }
- mpz_t maxt;
- mpz_init(maxt);
- mpz_set(maxt,it->nc);
- set<DataEntry>::iterator nit;
- for(nit=results.begin();nit!=results.end();++nit){
- if(mpz_cmp(nit->datas[N-1],maxt)<=0)
- dump(*nit);
- }
- mpz_clear(maxt);
- }
-
- int main()
- {
- int i;
- search(0);
- #ifdef IONLY
- dumpall();
- #else
- gen_more();
- #endif
- }
复制代码 我们知道n=2时方程没有非平凡解(也就是只有全0的解)
而利用这个程序还可以知道在100以内,在n分别为
2,6,9,11,12,15,16,18,20,21,24,29,32,33,36,41,42,45,48,50,51,56,57,60,66,72,76,77,81,82,84,90,96,99时没有非平凡解。而对于100以内(包括100)的其他n都有非平凡解。 |
|