# Это программа на 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)]
intervals = [(2, 20001)]
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)]
Я думаю, вам стоит вообще внешний цикл убрать и всегда работать только с одним интервалом.А если я захочу перезагрузить компьютер, а интервал ещё не досчитался?
Можно чуть чуть ускорить решение, если не увеличивать c в цикле, а вычислить его по формуле (an+bn-1)^(1/n)Спасибо, попробую, надеюсь получиться. Вначале хочу разобраться с интервалом.
Какая-нибудь функция pow вам поможетЯ экспериментировал с pow и math.pow, оказалось, что ** работает быстрее.
не из заданного интервалаДа, я знаю, можете переписать мою программу для создания интервала, а то для меня это сложно. Всего одну строчку:
intervals = [(10000 + i * 1000, 11001 + i * 1000) for i in range(10)]
print(intervals)
А если я захочу перезагрузить компьютер, а интервал ещё не досчитался?
Можно чуть чуть ускорить решение, если не увеличивать c в цикле, а вычислить его по формуле (an+bn-1)^(1/n).
# Это программа на Python
# Импортируем модуль sqlite3
import sqlite3
# Подключение к базе данных SQLite
conn = sqlite3.connect('solutions1.db')
# Создаем таблицу solutions в базе данных
cur = conn.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS solutions (a INT, b INT, c INT, a_cube INT, b_cube INT, c_cube INT, begin INT, end INT)")
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))
# Сохраняем изменения в базе данных
conn.commit()
# Закрываем соединение с базой данных SQLite
conn.close()
# Это программа на Python
import itertools
n= 3
# Задаем интервалы значений для a,b,c
intervals = [(1 + i * 1000, 1001 + i * 1000) for i in range(20)]
# Создаем все возможные комбинации интервалов для a и b
interval_pairs = itertools.product(intervals, repeat=2)
# Для каждой пары интервалов
for (a_begin, a_end), (b_begin, b_end) in interval_pairs:
# Для каждого значения a в интервале
for a in range(a_begin, a_end+1):
an = a ** n
c = a; cn = an
# Для каждого значения b в интервале
for b in range(b_begin, b_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 | {a_begin} {a_end} {b_begin} {b_end}')
Долгоиграющие джобы можно разбить на итерации. Или пачки. В данном случае пачкой будут Ranges.
И выбрать такой интервал чтоб не сильно долго работала пачка (5 минут) и в тоже время чтоб можно было оперативно прервать без жалости.
И завести табличку ranges. Пачка троек отработала - закоммитил.
При следующем запуске мы начинаем не с начала а со следующей пачки.
Честно я-бы для этой задачи базами не парился. Тут хвататет CSV файлов.
Приведенный вами код непонятно зачем интервалы использует. С тем же успехом можно гнать просто 2 цикла от 1 до 20000 для a и b.Мне же нужно было попробовать один большой интервал и много маленьких, чтобы увидеть потери.
В чем преимущество? CSV - это Microsoft Excel или LibreOffice Calc, а это значит, что нужно долго ждать, когда ну скажем LibreOffice Calc откроется, чтобы посмотреть на табличку, плюс CSV еще и конвертировать нужно, т.е. плюс еще какое-то время. DB Browser for SQLite открывается быстрее. LibreOffice Calc любит округлять, не приятно будет.
Formula ; Sum ; Range
9³+10³=12³+1 ; 729+1000=1728+1 ; 2 1001
Мне же нужно было попробовать один большой интервал и много маленьких, чтобы увидеть потери.
я ума не приложу какие запросы тебе там
нужны и почему ты просто не мог поискать это в тексте
Сделай один Range полным-полным перебором. Потом внеси оптимизацию
Здесь срезать углы не получиться
В принципе получилось же с помощью itertools.product.
Ничего вы не срезали. А всего-лишь чуть-чуть поменяли порядок перебора все тех же пар чисел, сильно усложнив кодПерепишите, пожалуйста код, как будет лучше. Как по мне вы говорите загадками и скорей всего я ответ на загадку не найду.
Почитай вообще литературу как тестируется ПО. Краевые тесты. Property-based testingСпасибо.
Ты пишешь в принципе получилось. А как ты докажешь что учел ВСЕ сочетания целых чисел?Я же сделал 40 циклов, раньше была недостача после маленьких циклов, теперь ее нет:
[{6,8,9}, {8,6,9} .... ]
Ферштейн?Страшно сказать что не verstehen. Обычно когда часто говоришь, что глупс, у собеседника начинается агрессия. По этому не признаюсь.
наискосокИз вариантов: вдоль, в поперек, по диагонали или по частям, я предпочитаю даже не нож, а мясорубку, т.е. по частям.
Перепишите, пожалуйста код, как будет лучше. Как по мне вы говорите загадками и скорей всего я ответ на загадку не найду.
begin, end = 1, 20000
for a in range(begin, end+1):
an = a ** n
c = a; cn = an
# Для каждого значения b в интервале
for b in range(begin, 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 = 1, 20001
begin, end = 1, 1001
begin, end = 823, 3001
begin, end = 2820, 12001
то запускаетесь опять от 1По какому признаку мне понять, что нужно запуститься с 1?
Да, первые 10000 пар вы просмотрите опятьНеприятно конечно, но потом если что из базы удалю дубликаты.
то начало внешнего цикла можно сделать 2476Как вы определяете алгоритм, когда с 1 начинать, а когда с 2476?
я привел кодСпасибо!!! Приведите пожалуйста несколько примеров (циклов, интервалов) чтобы было понятно. Код без интервалов теряет смысл. Вопрос не про код, формула и код могут быть разными, вопрос именно про интервалы. Вы показали один интервал, одного интервала мало, меня интересует разбивка интервалов.
Как вы определяете алгоритм, когда с 1 начинать, а когда с 2476?
end = 20000
a_begin = # последнее число a, выведенное раньше, или 1
for a in range(a_begin, end+1):
an = a ** n
c = a; cn = an
# Для каждого значения b в интервале
for b in range(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')
Select A from solutions limit 1 order A desc
Давай автор заканчивай скорее с ФермаДа, вы снова правы. Нельзя так долго не понимать. Во-первых, стыдно, а во-вторых когда кто-то, долго не понимает учителю обычно матюкаться хочется - не по христиански это - да - заканчиваем.
У тебя на очереди - эллиптические кривые.Я уже доказал теорему Ферма с помощью эллиптических кривых. Зашел на сайт Wolfram Alpha, сказал калькулятору:
elliptic curve a^3+b^3=c^3
или a^3+b^3=c^3
или Power[a,3]+Power[b,3]=Power[c,3]
или a^3 + b^3 - c^3 = 0
Перезапуск - не такая частая операцияУ меня только что электричества не было, это знак наверное - пора заканчивать.
Посмотреть на предыдущий вывод до перезагрузки, взять максимальное aДа, конечно посмотрю, по тестирую. Но по этому вопросу я вас больше мучить не буду. Спасибо вам огромное, за помощь и терпение!!!
Нельзя так долго не понимать.
Это прекрасно. Не забудь зайти получить денежную премию.
end = 20001
a_begin = 1
end = 1001
a_begin = 1
end = 2001
a_begin = 823
end = 3001
a_begin = 1207
end = 4001
a_begin = 2820
end = 5001
a_begin = 3230
end = 6001
a_begin = 3230
end = 7001
a_begin = 5984
end = 8001
a_begin = 6702
end = 9001
a_begin = 6702
end = 10001
a_begin = 8675
end = 12001
a_begin = 8675
end = 13001
a_begin = 11903
end = 17001
a_begin = 11903
end = 18001
a_begin = 16806
end = 19001
a_begin = 17328