Все же хочется программу для перебора теоремы Ферма в кубе. Скажем в шашках знать правила позиционной игры это хорошо, но с компьютером, у которого все ходы записаны, никто не сможет сравниться. Леонардо хорош, но раз уж у шашек есть программа, хочется и для Ферма тоже программу.
mayton2019 предложил очень красивый алгоритм
ДНК, но он сложен для меня, и у меня не получится сделать из него проверку a³+b³=c³.
Wataru говорит, что
специализированный код под задачу будет эффективнее
Но:
1. Не пропускает ли этот код нужные комбинации?
2. Этот код не для Windows;
3. Если я в формуле a³+b³+c³=3 поменяю 3, на 0 будет ли программа правильно считать?
4. Да и эта программа тоже на C, а мне понятнее Python.
Побоялся воспользоваться советом
Василий Дёмин - не хочется себе навредить.
for(int a = 0; ; a++) {
for(int b = 0; ; b++) {
// вычисления для a и b
// вычисления для -a и b
// вычисления для a и -b
//
}
}
Чтобы ничего не потерять, и была возможность останавливать (считать по частям), написал такую программу:
main.py
import sqlite3
from datetime import datetime
from tqdm import tqdm
# Устанавливаем диапазон для переменных
minValue = -3
maxValue = 3
# Создаем соединение с базой данных SQLite
conn = sqlite3.connect('equationResults.db')
cursor = conn.cursor()
# Проверяем, существует ли таблица cubeResults
cursor.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='cubeResults'")
if cursor.fetchone() is None:
print("Таблица cubeResults не найдена в базе данных. Пожалуйста, запустите populateDatabase.py, чтобы заполнить базу данных.")
conn.close()
exit()
# Создаем таблицу, если она еще не существует
cursor.execute('''
CREATE TABLE IF NOT EXISTS results (
a INTEGER,
b INTEGER,
c INTEGER,
equationResult TEXT
)
''')
# Создаем таблицу для хранения диапазонов и результатов
cursor.execute('''
CREATE TABLE IF NOT EXISTS rangeResults (
minValue INTEGER,
maxValue INTEGER,
firstA INTEGER,
firstB INTEGER,
firstC INTEGER,
lastA INTEGER,
lastB INTEGER,
lastC INTEGER,
startDate TEXT,
startTime TEXT,
endDate TEXT,
endTime TEXT
)
''')
# Создаем индексы для столбцов a, b и c, если они еще не существуют
cursor.execute('CREATE INDEX IF NOT EXISTS idxA ON results(a)')
cursor.execute('CREATE INDEX IF NOT EXISTS idxB ON results(b)')
cursor.execute('CREATE INDEX IF NOT EXISTS idxC ON results(c)')
# Функция для получения куба числа из базы данных
def getCubeFromDatabase(number):
cursor.execute('SELECT cube FROM cubeResults WHERE number=?', (number,))
return cursor.fetchone()[0]
# Функция для проверки уравнения
def checkEquation(a, b, c):
return getCubeFromDatabase(a) + getCubeFromDatabase(b) == getCubeFromDatabase(c)
# Функция для проверки, есть ли результат уже в базе данных
def isInDatabase(a, b, c):
cursor.execute('SELECT * FROM results WHERE a=? AND b=? AND c=?', (a, b, c))
return cursor.fetchone() is not None
try:
# Начинаем транзакцию
conn.execute('BEGIN TRANSACTION')
firstRecorded = False
lastA = lastB = lastC = None
# Записываем дату и время начала
startDate = datetime.now().strftime('%Y-%m-%d')
startTime = datetime.now().strftime('%H:%M:%S')
# Проверяем уравнение для всех значений в заданном диапазоне
for a in tqdm(range(minValue, maxValue + 1), desc='Processing a'):
for b in tqdm(range(minValue, maxValue + 1), desc='Processing b', leave=False):
for c in tqdm(range(minValue, maxValue + 1), desc='Processing c', leave=False):
# Исключаем варианты, где a, b или c равны нулю
if a == 0 or b == 0 or c == 0:
continue
# Если результат уже есть в базе данных, пропускаем его
if isInDatabase(a, b, c):
continue
# Если уравнение верно, сохраняем результат в базе данных
if checkEquation(a, b, c):
equationResult = 'Равно'
else:
equationResult = '!='
cursor.execute('INSERT INTO results VALUES (?, ?, ?, ?)', (a, b, c, equationResult))
# Записываем первые значения a, b, c
if not firstRecorded:
firstA, firstB, firstC = a, b, c
firstRecorded = True
# Обновляем последние значения a, b, c
lastA, lastB, lastC = a, b, c
# Записываем дату и время окончания
endDate = datetime.now().strftime('%Y-%m-%d')
endTime = datetime.now().strftime('%H:%M:%S')
# Записываем диапазон, результаты и время в таблицу rangeResults
cursor.execute('INSERT INTO rangeResults VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', (minValue, maxValue, firstA, firstB, firstC, lastA, lastB, lastC, startDate, startTime, endDate, endTime))
# Завершаем транзакцию
conn.execute('COMMIT')
except KeyboardInterrupt:
print("\nПрервано пользователем. Останавливаюсь...")
finally:
# Закрываем соединение с базой данных
conn.close()
populateDatabase.py
import sqlite3
from tqdm import tqdm
# Устанавливаем диапазон для переменных
minValue = -1000
maxValue = 1000
# Создаем соединение с базой данных SQLite
conn = sqlite3.connect('equationResults.db')
cursor = conn.cursor()
# Создаем таблицу, если она еще не существует
cursor.execute('''
CREATE TABLE IF NOT EXISTS cubeResults (
number INTEGER,
cube INTEGER
)
''')
# Создаем индексы для столбцов number и cube, если они еще не существуют
cursor.execute('CREATE INDEX IF NOT EXISTS idxNumber ON cubeResults(number)')
cursor.execute('CREATE INDEX IF NOT EXISTS idxCube ON cubeResults(cube)')
# Начинаем транзакцию
conn.execute('BEGIN TRANSACTION')
# Заполняем таблицу кубами чисел
for number in tqdm(range(minValue, maxValue + 1), desc='Processing numbers'):
cube = number**3
cursor.execute('INSERT INTO cubeResults VALUES (?, ?)', (number, cube))
# Завершаем транзакцию
conn.execute('COMMIT')
# Закрываем соединение с базой данных
conn.close()
Поможете сделать код лучше? Пожалуйста, не удаляйте вопрос сразу, подскажите, как можно еще лучше конкретизировать?