Koren1
@Koren1

Поможете сделать код лучше, чем у меня сейчас, a³+b³=c³?

Все же хочется программу для перебора теоремы Ферма в кубе. Скажем в шашках знать правила позиционной игры это хорошо, но с компьютером, у которого все ходы записаны, никто не сможет сравниться. Леонардо хорош, но раз уж у шашек есть программа, хочется и для Ферма тоже программу. 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()


Поможете сделать код лучше? Пожалуйста, не удаляйте вопрос сразу, подскажите, как можно еще лучше конкретизировать?
  • Вопрос задан
  • 218 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
2. Этот код не для Windows;


Там нет ничего платформо-зависимого. Если установите какой-нибудь mingw на windows, то оно makefile съест.

В крайнем случае, установите любой C компилятор и введите команду вручную (последняя строчка тут)

3. Если я в формуле a³+b³+c³=3 поменяю 3, на 0 будет ли программа правильно считать?

Там в описании написано "cubefree k = +/- 3 mod 9 at most 1000", т.е. для k=0 не сработает.

Поможете сделать код лучше?


Выкиньте цикл по c. Вам не надо его перебирать, а вам надо решить уравнение c³=3-a³+b³.
Для чего просто вычислите значение справа, потом возьмите кубический корень: int((3-a**3-b**3)**(1/3.0)). Не забудьте только проверить, что это значение c подходит, ибо тут корень округляется до целого. И не факт, что уравнение выполняется.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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