当年话下
y>0在第一个八分圆内搜索就足够了x<y(四个解(±n, ±n)是显而易见的,并且通过对称性,一个解会(x, y)产生 8 个副本(±x, ±y), (±y, ±x))。通过单调性,对于一个给定y的,至多有一个x。您可以通过逐步跟随圆弧,减少y然后调整来找到它x。如果您x²+y²≤2n²尽可能严格地保持条件,您会得到下面的代码,该代码已优化为仅使用初等整数算术(为了提高效率,2x使用 代替x)。 x, y, d= 2 * n, 2 * n, 0 while y > 0: y, d= y - 2, d - y + 1 if d < 0: x, d= x + 2, d + x + 1 if d == 0: print(x >> 1, '² + ', y >> 1, '² = 2.', n, '²', sep='')以下是nbetween1和的所有解决方案100:7² + 1² = 2.5²14² + 2² = 2.10²17² + 7² = 2.13²21² + 3² = 2.15²23² + 7² = 2.17²28² + 4² = 2.20²31² + 17² = 2.25²35² + 5² = 2.25²34² + 14² = 2.26²41² + 1² = 2.29²42² + 6² = 2.30²46² + 14² = 2.34²49² + 7² = 2.35²47² + 23² = 2.37²51² + 21² = 2.39²56² + 8² = 2.40²49² + 31² = 2.41²63² + 9² = 2.45²62² + 34² = 2.50²70² + 10² = 2.50²69² + 21² = 2.51²68² + 28² = 2.52²73² + 17² = 2.53²77² + 11² = 2.55²82² + 2² = 2.58²84² + 12² = 2.60²71² + 49² = 2.61²79² + 47² = 2.65²85² + 35² = 2.65²89² + 23² = 2.65²91² + 13² = 2.65²92² + 28² = 2.68²98² + 14² = 2.70²103² + 7² = 2.73²94² + 46² = 2.74²93² + 51² = 2.75²105² + 15² = 2.75²102² + 42² = 2.78²112² + 16² = 2.80²98² + 62² = 2.82²97² + 71² = 2.85²113² + 41² = 2.85²115² + 35² = 2.85²119² + 17² = 2.85²123² + 3² = 2.87²119² + 41² = 2.89²126² + 18² = 2.90²119² + 49² = 2.91²133² + 19² = 2.95²137² + 7² = 2.97²124² + 68² = 2.100²140² + 20² = 2.100²
拉风的咖菲猫
您可以通过仅考虑一个象限并乘以 4 来优化此算法。import mathdef psearch(n, count): for x in range( 0 , 2*n + 1): ysquare = 2*(n**2) - x * x if (ysquare <0): break y = int(math.sqrt(ysquare)) if ysquare == y * y : print(x,y) count+=1 return countprint(psearch(13241324,0) * 4)输出(1269716, 18682964)(1643084, 18653836)(11027596, 15134644)(12973876, 13503476)(13241324, 13241324)(13503476, 12973876)(15134644, 11027596)(18653836, 1643084)(18682964, 1269716)36