northwolves 发表于 2024-2-23 13:49:53

有没有仅由7,8,9组成的平方数呢? 看到一篇文章讲到$1-1.8*10^{22}$之内数字的平方数无满足条件的解

northwolves 发表于 2024-2-23 13:57:41

6,7,8,9的很多,10^8以内有121个:
Select, Min] > 5 &]
{3,26,83,264,313,824,836,883,887,937,3114,8167,8813,8887,8937,9417,9833,25824,26264,29614,29626,89324,89437,93637,94863,98336,260167,262617,314113,817863,817924,818333,818474,823887,828667,835386,875614,931117,936417,937383,947617,989286,993367,994836,998333,2639867,2772886,2774867,2949386,3114113,3125167,3128576,3158637,3162083,8172313,8238924,8306424,8819687,8881367,8943583,9309617,9311117,9327313,9363637,9427613,9475167,9480974,9843764,9884164,9893887,9983336,9994833,25845676,26038026,26053176,26206676,26265313,26419063,26434214,27870714,27874176,28049736,29456714,29642874,29797617,31284176,31448367,31603764,81785676,81791063,81792236,81846117,82395387,82454836,82927613,82986667,83486333,83658214,87565786,87736417,88311374,88701633,88863924,88875137,89257924,89318363,89318474,93255974,93635937,93690383,93792313,94285676,98370676,98426063,98478367,98483333,98934214,99448367,99483667,99498633,99983333}

mathe 发表于 2024-2-23 17:36:34

northwolves 发表于 2024-2-21 15:34
a(162)>123000000000

153 1001283601183


和我们主要讨论的话题的代码应该是类似的,我通过两个程序来逼近
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdint.h>
#include <omp.h>
#include <gmpxx.h>
#include <iostream>

#define TSIZE 21
#define MDEPTH 24
#define TOM   (9*(2*MDEPTH)+1)
mpz_class tmax;
#define STATM 10000
int digs;

int getdig(int x)
{
    int s=0;
    while(x>0){
      s+=x%10;
      x/=10;
    }
    return s;
}

void initdigs()
{
    int i;
    for(i=0;i<STATM;i++){
      digs=getdig(i);
    }
}

int getbitones(long x)
{
    int s=0;
    while(x){
        if(x&1)s++;
        x>>=1;
    }
    return s;
}

int sumdigits(const mpz_class& x)
{
    mpz_class y=x;
    int s=0;
    while(y>0){
          mpz_class z=y%STATM;
          s+=digs;
          y=y/STATM;
    }
    return s;
}


#define INITR 1000000
#define INITL 6
struct SD{
    int curlen;
    mpz_class lmax;
    mpz_class mod;
    mpz_class X;
};

void search(struct SD *sd)
{
    mpz_class X=sd->X*sd->X;
    int len2 = sumdigits(X%sd->mod);
    if(9*sd->curlen-len2>TSIZE)return;
    int len = sumdigits(X);
    if(sd->lmax==0||sd->X<sd->lmax){
        sd->lmax=sd->X;
#pragma omp critical
        {
          if(tmax==0||sd->X<tmax){
                tmax=sd->X;
                std::cout<<len<<":"<<sd->X<<std::endl;
                fflush(stdout);
          }
        }
    }
    if(sd->curlen>=MDEPTH)return;
    int i;
    sd->curlen++;
    mpz_class modd10=sd->mod;
    sd->mod *=10;
    for(i=0;i<=9;i++){
        search(sd);
        sd->X += modd10;
    }
    sd->mod /=10;
    sd->curlen--;
    sd->X -= 10* sd->mod;
}
int gid;
int main()
{
    initdigs();
#pragma omp parallel
    {
        int i;
        int end=0;
        SD *sd=new SD;
        sd->curlen=INITL;
        sd->mod=INITR;
        while(!end){
#pragma omp critical
          {
                i=gid++;
          }
          if(i>=INITR)break;
          sd->X=i;
          int len = sumdigits((sd->X*sd->X)%INITR);
          int used = 9*sd->curlen-len;
          if(used>TSIZE)continue;//skip number used to much
          search(sd);
        }
    }

    {
          std::cout<<"Final result:\n";
          int i;
          for(i=0;i<TOM;i++){
                if(tmax>0){
                     std::cout<<i<<"\t"<<tmax<<std::endl;
                }
          }
    }

    return 0;
}


以及
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdint.h>
#include <omp.h>
#include <gmpxx.h>
#include <iostream>

//#define TSIZE 14
//#define MDEPTH 10
#define TSIZE 20
#define MDEPTH 24
#define TOM   (9*(2*MDEPTH)+1)
mpz_class tmax;
#define STATM 10000
int digs;

int getdig(int x)
{
    int s=0;
    while(x>0){
      s+=x%10;
      x/=10;
    }
    return s;
}

void initdigs()
{
    int i;
    for(i=0;i<STATM;i++){
      digs=getdig(i);
    }
}

int getbitones(long x)
{
    int s=0;
    while(x){
        if(x&1)s++;
        x>>=1;
    }
    return s;
}

int sumdigits(const mpz_class& x)
{
    mpz_class y=x;
    int s=0;
    while(y>0){
          mpz_class z=y%STATM;
          s+=digs;
          y=y/STATM;
    }
    return s;
}


#define INITR 1000000
#define INITL 6
struct SD{
    int curlen;
    int mislen;
    mpz_class lmax;
    mpz_class mod;
    mpz_class X;
};

void search(struct SD *sd)
{
    mpz_class LY=sd->X*sd->mod;
    mpz_class X=sqrt(LY+sd->mod-1);
    while(1){
      mpz_class Z=(X*X);
      if(Z<LY)break;
      int len = sumdigits(Z);
      if(sd->lmax==0||X<sd->lmax){
        sd->lmax=X;
#pragma omp critical
        {
          if(tmax==0||X<tmax){
                tmax=X;
                std::cout<<len<<":"<<X<<":{"<<sd->curlen<<":"<<sd->X<<"}"<<std::endl;
                fflush(stdout);
          }
        }
      }
      X--;
    }
    if(sd->curlen>=MDEPTH)return;
    int i;
    sd->X*=10;sd->X+=9;
    sd->mod *=10;
    sd->curlen++;
    for(i=9;i>=0;i--){
        if(sd->mislen<=TSIZE){
          search(sd);
        }
        sd->X--;
        sd->mislen++;
    }
    sd->mislen-=10;
    sd->X++;sd->X/=10;
    sd->curlen--;
    sd->mod /=10;
}
int gid;
int main()
{
    initdigs();
    gid=INITR/100;
#pragma omp parallel
    {
        int i;
        int end=0;
        SD *sd=new SD;
        sd->curlen=INITL;
        sd->mod=INITR;
        while(!end){
#pragma omp critical
          {
                i=gid++;
          }
          if(i>=INITR)break;
          sd->X=i;
          int len1 = sumdigits(sd->X);
          sd->mislen=9*sd->curlen-len1;
          if(i<INITR/10)sd->mislen-=9;
          if(sd->mislen>TSIZE)continue;//skip number used to much
          search(sd);
        }
    }

    {
          std::cout<<"Final result:\n";
          int i;
          for(i=0;i<TOM;i++){
                if(tmax>0){
                     std::cout<<i<<"\t"<<tmax<<std::endl;
                }
          }
    }

    return 0;
}

王守恩 发表于 2024-2-23 17:54:28

mathe 发表于 2024-2-23 17:36
和我们主要讨论的话题的代码应该是类似的,我通过两个程序来逼近

以及

类似的: A053974 数字 k,使得 k^2 仅包含数字 {6,8,9}。                1
3, 83, 264, 836, 3114, 8167, 98336, 818333, 828667, 994836, 9309617, 984833336, 82885443167, 948097937383, 984879122886, 2588184048685235767383,

mathe 发表于 2024-2-23 18:06:27

northwolves 发表于 2024-2-23 13:49
有没有仅由7,8,9组成的平方数呢? 看到一篇文章讲到$1-1.8*10^{22}$之内数字的平方数无满足条件的解 ...

验证了小于10^{24}的数字的平方数不满足条件

王守恩 发表于 2024-2-24 07:05:11

本帖最后由 王守恩 于 2024-2-24 07:39 编辑

数字串(1)极限性价比(数码和: 数位)=33:4。
数字串(2)极限性价比(数码和: 数位)=33:4。
数字串(3)性价比(数码和: 数位)好像就差多了。
数字串(1)。Table // TableForm
{"583", "339889"},
{"59833", "3579987889"},
{"5998333", "35979998778889"},
{"599983333", "359979999877788889"},
{"59999833333", "3599979999987777888889"},
{"5999998333333", "35999979999998777778888889"},
{"599999983333333", "359999979999999877777788888889"},
{"59999999833333333", "3599999979999999987777777888888889"},
{"5999999998333333333", "35999999979999999998777777778888888889"},
{"599999999983333333333", "359999999979999999999877777777788888888889"},
{"59999999999833333333333", "3599999999979999999999987777777777888888888889"},
{"5999999999998333333333333", "35999999999979999999999998777777777778888888888889"},
{"599999999999983333333333333", "359999999999979999999999999877777777777788888888888889"},
{"59999999999999833333333333333", "3599999999999979999999999999987777777777777888888888888889"},
{"5999999999999998333333333333333", "35999999999999979999999999999998777777777777778888888888888889"},
{"599999999999999983333333333333333", "359999999999999979999999999999999877777777777777788888888888888889"},
{"59999999999999999833333333333333333", "3599999999999999979999999999999999987777777777777777888888888888888889"},
{"5999999999999999998333333333333333333", "35999999999999999979999999999999999998777777777777777778888888888888888889"},
{"599999999999999999983333333333333333333", "359999999999999999979999999999999999999877777777777777777788888888888888888889"},
{"59999999999999999999833333333333333333333", "3599999999999999999979999999999999999999987777777777777777777888888888888888888889"}
数字串(2)。Table // TableForm
{"7", "49"},
{"2827", "7991929"},
{"298327", "88998998929"},
{"29983327", "898999897988929"},
{"2999833327", "8998999989779888929"},
{"299998333327", "89998999998977798888929"},
{"29999983333327", "899998999999897777988888929"},
{"2999999833333327", "8999998999999989777779888888929"},
{"299999998333333327", "89999998999999998977777798888888929"},
{"29999999983333333327", "899999998999999999897777777988888888929"},
{"2999999999833333333327", "8999999998999999999989777777779888888888929"},
{"299999999998333333333327", "89999999998999999999998977777777798888888888929"},
{"29999999999983333333333327", "899999999998999999999999897777777777988888888888929"},
{"2999999999999833333333333327", "8999999999998999999999999989777777777779888888888888929"},
{"299999999999998333333333333327", "89999999999998999999999999998977777777777798888888888888929"},
{"29999999999999983333333333333327", "899999999999998999999999999999897777777777777988888888888888929"},
{"2999999999999999833333333333333327", "8999999999999998999999999999999989777777777777779888888888888888929"},
{"299999999999999998333333333333333327", "89999999999999998999999999999999998977777777777777798888888888888888929"},
{"29999999999999999983333333333333333327", "899999999999999998999999999999999999897777777777777777988888888888888888929"},
{"2999999999999999999833333333333333333327", "8999999999999999998999999999999999999989777777777777777779888888888888888888929"}
数字串(3)。Table[{Floor@Sqrt, Floor]^2}, {n, 20}] // TableForm
{"3", "9"},
{"31", "961"},
{"316", "99856"},
{"3162", "9998244"},
{"31622", "999950884"},
{"316227", "99999515529"},
{"3162277", "9999995824729"},
{"31622776", "999999961946176"},
{"316227766", "99999999989350756"},
{"3162277660", "9999999998935075600"},
{"31622776601", "999999999956753113201"},
{"316227766016", "99999999999470044512256"},
{"3162277660168", "9999999999997600893788224"},
{"31622776601683", "999999999999949826038432489"},
{"316227766016837", "99999999999999409792567484569"},
{"3162277660168379", "9999999999999997900254631487641"},
{"31622776601683793", "999999999999999979762122758866849"},
{"316227766016837933", "99999999999999999873578871987712489"},
{"3162277660168379331", "9999999999999999993682442519108007561"},
{"31622776601683793319", "999999999999999999937454230741109035761"},
{"316227766016837933199", "99999999999999999999437522862413986373601"},
{"3162277660168379331998", "9999999999999999999994348728804092706672004"},
{"31622776601683793319988", "999999999999999999999940837306036211360320144"},
{"316227766016837933199889", "99999999999999999999999775830391924218829612321"},
{"3162277660168379331998893", "9999999999999999999999996556705153432158953225449"},
{"31622776601683793319988935", "999999999999999999999999971898281360053828522434225"},
{"316227766016837933199889354", "99999999999999999999999999719650264140086317842537316"},
{"3162277660168379331998893544", "9999999999999999999999999997263247695355666440244879936"},
{"31622776601683793319988935444", "999999999999999999999999999979306982349036990584399477136"},
{"316227766016837933199889354443", "99999999999999999999999999999828064831004726657639283840249"}
目标很明确: T(n)应该从A067179中突围出来。
显然: T(44)=893241282627485818275387^2=797879988989995997899989877988999997998969999769=44*9/48=33/4
这是极限性价比(数码和: 数位)了吗?!

mathe 发表于 2024-2-24 07:38:09

mathe 发表于 2024-2-18 17:38
利用前面思路重新改写了程序,搜索所有不超过20位整数(平方不超过40位), (不限于3的倍数了)
一个程序是平 ...


148 262087386170528775387
149 223584183022838178583
150 435877272864734253937
151 741551749981004224417
152 754718284918279954614
153 888142995231510436417
154 1413081381198439327133
155 2190638491396718286667
156 2827719752694560960583
157 2999999999833333333327
158 2976388751488907738914
159 8244385168100697671333
160 8882505274864168010583
161 14104963594032775808167
162 22360389084025298775583
163 24490814584000030724417
164 43566041821463294027313
165 44384681805325572255974
166 70497517615005252750707
167 83486465909152004768333
168 99689518004050952477133
169 169705568555949244636187
170 199997474684001940194833
171 281067587951541966833333
172 315892386718941028010583
173 312713447088224669275583
174 706327748923187850491833
175 984311332861691681833333
176 893241282627485818275387
这是楼上最新配置代码跑出的结果,其中第二个程序有一个线程运行的时间特别长,所以等了较长时间。
其中165项(对应和370)对应的数据44384681805325572255974上面两个配置跑出来的都不是最优
第一个程序结果是44721359538546565724417,第二个程序结果为59999999999833333333333
由于两个程序搜索的差距分别为20和21,加起来只有41,而$44721359538546565724417^2$是46位数,46×9-370=44,所以搜索范围不够
然后我又专门跑了一个老版本仅针对特定目标的代码,对应第二个程序但是将范围扩到到24 (由于$44721359538546565724417^2$第一位是1,已经用掉8个差距,其实搜索范围不大),
   找到了44384681805325572255974。
另外还有361,369,379需要搜索的范围都大于41,(它们平方数第一位最多是2),同样用那代码验证,没有找到更优的结果。
其中另外一个比较有意思的是两个程序中大部分情况第一个代码已经找到最优结果了,但是第二个代码找到最优结果的比例要低很多,主要原因应该是第二个代码会让平方数的前面一半数据之和尽量大,所以通常会使找到的数更大。

下面是那个老版本代码,主要需要配置TLEN,代表平方数的长度,FIRSTD代表已经平方数最高位数值,比如如果是2,程序会仅搜索最高位为0,1,2的情况。
SLEN代表需要搜索的平方数的前一半的长度,我们这里总是TLEN/2的下取整,来和第二个程序匹配。 TSIZE是搜索的数字和差距,但是扣除了最高位FIRSTD已经占掉的差距。
TO代表搜索的平方数所有数字位和。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <stdint.h>
#include <omp.h>
#include <gmpxx.h>
#include <iostream>

#define TLEN 47
#define FIRSTD 2
#define SLEN 23
#define TSIZE 16
#define TO 379
#define WITHED 1

int getbitones(long x)
{
    int s=0;
    while(x){
        if(x&1)s++;
        x>>=1;
    }
    return s;
}

int numdigits(const mpz_class& x)
{
    mpz_class y=x;
    int s=0;
    while(y>0){
          mpz_class z=y%10;
          s+=z.get_si();
          y=y/10;
    }
    return s;
}

mpz_class getinitnum()
{
    mpz_class x=FIRSTD;
    int i;
    for(i=0;i<TLEN-1;i++){
        x*=10;x+=9;
    }
    return x;
}

bool getX(const mpz_class& I, long i, mpz_class& X)
{
    int j;
    int t,c=0;
    mpz_class M=1;
    X=I;
    for(j=0;j<TLEN-1;j++)M*=10;
    for(j=0,t=0;j<SLEN+TSIZE;j++){
        if(i&(1L<<j)){
          c++;
        }else{
          //X(t)=c;
          if(t==0&&c>FIRSTD)return false;
          if(c>9)return false;
          if(c>0)X-=c*M;
          M/=10;
          t++;
          c=0;
        }
    }
    return true;
}

mpz_class curbest;
int main()
{
    mpz_class I = getinitnum();
    long i;
    mpz_class localbest=0;
    mpz_class LD =1;
    for(i=0;i<(TLEN-SLEN);i++){
          LD*=10;
    }
#pragma omp parallel for private(localbest)
    for(i=0;i<(1L<<(SLEN+TSIZE));i++){
        if(getbitones(i)>TSIZE)continue;
        mpz_class X;
        if(getX(I, i, X)){
          mpz_class Y=sqrt(X);
          while(1){
          mpz_class Z=Y*Y;
          if(Z>=X+LD)break;
          int dg = numdigits(Z);
          if(dg==TO){
                  if(localbest==0||Y<localbest){
                     localbest=Y;
#pragma omp critical
                  if(curbest==0||localbest<curbest)
                  {
                        curbest=localbest;
                        std::cout<<"Found "<<TO<<" with "<<Y<<"^2="<<Z<<std::endl;
                        fflush(stdout);
                  }
                  }
          }
          Y=Y+1;
          }
        }
    }

    return 0;
}

northwolves 发表于 2024-2-24 09:56:57

王守恩 发表于 2024-2-23 08:14
光用数码9的平方数是没有的。
光用数码9,8的平方数是没有的。
光用数码9,8,7的平方数是没有的。


mathe版主的数据:

{{3,9},{707106074079263583,33/4},{94180040294109027313,331/40},{2976388751488907738914,355/43},{312713447088224669275583,388/47},{893241282627485818275387,33/4}}

王守恩 发表于 2024-2-24 13:49:02

northwolves 发表于 2024-2-24 09:56
mathe版主的数据:

{{3,9},{707106074079263583,33/4},{94180040294109027313,331/40},{297638875148890 ...
目标很明确: T(n)应该从A067179中突围出来。
T(33)=297/36
T(44)=396/48
T(55)=495/60
T(66)=594/72
T(77)=693/84
T(88)=792/96
虽然这只是一厢情愿,大胆去想,错不了。这些数, 会很多吗(我这个不行)? 谢谢!
Select, Floor]/IntegerLength[#^2]]≥8 &]

northwolves 发表于 2024-2-24 13:54:36

ss={3,707106074079263583,943345110232670883,94180040294109027313,2976388751488907738914,312713447088224669275583,893241282627485818275387,314610537013606681884298837387,9984988582817657883693383344833};Table[{t,t^2,Total@IntegerDigits/IntegerLength},{t,ss}]//TableForm

3        9        9
707106074079263583        499998999999788997978888999589997889        33/4
943345110232670883        889899996999889979488999999795999689        33/4
94180040294109027313        8869879989799999999898984986998979999969        331/40
2976388751488907738914        8858889999989698989999979889997999989899396        355/43
312713447088224669275583        97789699989799889886988697997987998989999989889        388/47
893241282627485818275387        797879988989995997899989877988999997998969999769        33/4
314610537013606681884298837387        98979789999989979988999999989499999797975998897999868987769        487/59
9984988582817657883693383344833        99699996998998979989989997788978889798779999999969798987797889        513/62

页: 1 2 3 4 [5] 6 7 8 9 10 11 12 13
查看完整版本: 这样的A有多少个?