Задать вопрос
Koren1
@Koren1

Как правильно задать интервал для формулы a³+b³=c³+1?

# Это программа на Python
n= 3

# Задаем интервалы значений для a,b,c
intervals = [(2, 20001)]
#intervals = [(2, 1001), (1000, 2001), (2000, 3001), (3000, 4001), (4000, 5001), (5000, 6001), (6000, 7001), (7000, 8001), (8000, 9001), (9000, 10001), (10000, 11001), (11000, 12001), (12000, 13001), (13000, 14001), (14000, 15001), (15000, 16001), (16000, 17001), (17000, 18001), (18000, 19001), (19000, 20001)]

# Перебираем значения из списка intervals и для каждого интервала генерируем значения a,b,c такие,
# что a³+b³=c³+1. Если такие значения найдены, то они выводятся на экран и записываются в таблицу solutions.
for Begin, End in intervals:
    for a in range(Begin, End+1):
        an= a ** n
        c= a; cn= an
        for b in range(a+1, End+1):
            anbn= an + b ** n
            while anbn > cn:
                c+= 1
                cn= (c ** n)+1
            if anbn == cn: # Bingo!
                print(f'{a}³+{b}³={c}³+1 | {a**3}+{b**3}={c**3}+1 | {Begin} {End}')

                # Записываем решение и пределы в таблицу solutions
                cur.execute("INSERT INTO solutions VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (a, b, c, a**3, b**3, c**3, Begin, End))


Когда я задаю такой интервал:
intervals = [(2, 1001), (1000, 2001), (2000, 3001), (3000, 4001), (4000, 5001), (5000, 6001), (6000, 7001), (7000, 8001), (8000, 9001), (9000, 10001), (10000, 11001), (11000, 12001), (12000, 13001), (13000, 14001), (14000, 15001), (15000, 16001), (16000, 17001), (17000, 18001), (18000, 19001), (19000, 20001)]


Я получаю такой результат:
9³+10³=12³+1 | 729+1000=1728+1 | 2 1001
64³+94³=103³+1 | 262144+830584=1092727+1 | 2 1001
73³+144³=150³+1 | 389017+2985984=3375000+1 | 2 1001
135³+235³=249³+1 | 2460375+12977875=15438249+1 | 2 1001
244³+729³=738³+1 | 14526784+387420489=401947272+1 | 2 1001
334³+438³=495³+1 | 37259704+84027672=121287375+1 | 2 1001
1010³+1897³=1988³+1 | 1030301000+6826561273=7856862272+1 | 1000 2001
1033³+1738³=1852³+1 | 1102302937+5249879272=6352182208+1 | 1000 2001
3097³+3518³=4184³+1 | 29704593673+43539907832=73244501504+1 | 3000 4001
11161³+11468³=14258³+1 | 1390302566281+1508214295232=2898516861512+1 | 11000 12001

А когда я задаю такой интервал:
intervals = [(2, 20001)]

Я получаю такой результат:
9³+10³=12³+1 | 729+1000=1728+1 | 2 20001
64³+94³=103³+1 | 262144+830584=1092727+1 | 2 20001
73³+144³=150³+1 | 389017+2985984=3375000+1 | 2 20001
135³+235³=249³+1 | 2460375+12977875=15438249+1 | 2 20001
244³+729³=738³+1 | 14526784+387420489=401947272+1 | 2 20001
334³+438³=495³+1 | 37259704+84027672=121287375+1 | 2 20001
368³+1537³=1544³+1 | 49836032+3630961153=3680797184+1 | 2 20001
577³+2304³=2316³+1 | 192100033+12230590464=12422690496+1 | 2 20001
1010³+1897³=1988³+1 | 1030301000+6826561273=7856862272+1 | 2 20001
1033³+1738³=1852³+1 | 1102302937+5249879272=6352182208+1 | 2 20001
1126³+5625³=5640³+1 | 1427628376+177978515625=179406144000+1 | 2 20001
1945³+11664³=11682³+1 | 7357983625+1586874322944=1594232306568+1 | 2 20001
3097³+3518³=4184³+1 | 29704593673+43539907832=73244501504+1 | 2 20001
3753³+4528³=5262³+1 | 52861038777+92836605952=145697644728+1 | 2 20001
3987³+9735³=9953³+1 | 63378025803+922588140375=985966166177+1 | 2 20001
4083³+8343³=8657³+1 | 68067239787+580719929607=648787169393+1 | 2 20001
5856³+9036³=9791³+1 | 200818262016+737783038656=938601300671+1 | 2 20001
11161³+11468³=14258³+1 | 1390302566281+1508214295232=2898516861512+1 | 2 20001
13294³+19386³=21279³+1 | 2349454416184+7285588284456=9635042700639+1 | 2 20001

Казалось бы один и тот же интервал, от 2 до 20001, но когда я делаю интервал по 1000 я очень много теряю. Как правильно создавать интервал по 1000, чтобы ничего не терять?

Интервал от 10000 до 20001 с разбивкой по 1000:
intervals = [(10000, 11001), (11000, 12001), (12000, 13001), (13000, 14001), (14000, 15001), (15000, 16001), (16000, 17001), (17000, 18001), (18000, 19001), (19000, 20001)]


Я создаю так:
intervals = [(10000 + i * 1000, 11001 + i * 1000) for i in range(10)]

Помогите переписать эту строчку кода правильно.
  • Вопрос задан
  • 225 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Вы ищите a и b из одного и того же интервала. Но, как вы сами видите, могут быть решения, где разные переменные из разных интервалов. Поэтому один интервал на 1-2000 находит больше решений, чем два интервала 1-1000 и 1001-2000.

Я думаю, вам стоит вообще внешний цикл убрать и всегда работать только с одним интервалом.

Можно чуть чуть ускорить решение, если не увеличивать c в цикле, а вычислить его по формуле (an+bn-1)^(1/n). Какая-нибудь функция pow вам поможет. Она даст неуелое число, его надо округлить и проверить, что равенство ввполняется.

Еще, ваша проблема, что c у вас может быть не из заданного интервала. Надо или жто проверять, или перебирать b и c, считать a, вместо перебора a, b и вычисления c. Потому что a < c. И раз c перебирается в интервале - то и a будет в нем.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы