Проект Эйлера Задача 233

Я решил заняться Project Euler проблемой 233 следующей, но у меня возникли некоторые серьезные проблемы! Я провел некоторый анализ и добился неплохого прогресса, но теперь я застрял. Вот моя работа:

Лемма 1: поскольку окружность проходит через 4 угловые точки, существует по крайней мере 4 решения для любого n. Но на каждую точку окружности с отражением найдено 7 других. Следовательно, всегда имеется 8k+4 узлов решетки.

Лемма 2: окружность имеет радиус (√2)n и центр (n/2, n/2), поэтому ее уравнение (xn/2)^2 + (yn/2)^2 = [н/√2]^2. Это сводится к x^2+y^2 = n(x+y).

Лемма 3: если решение x^2+y^2 = n(x+y) записано (x, y, z), то другим решением будет (kx, ky, kz). Доказательством этого является:

(x+y)n = x^2+y^2

(kx)^2+(ky)^2 = (kx+ky)m
k(x^2+y^2) = (x+y)m
m = kn

Это было то же самое, что и я с этой мыслью - я не видел, куда идти дальше, но это включено, потому что это может быть полезно.

Моей следующей мыслью было переместить центр круга. Будет такое же количество решений, перемещающих его в любом измерении на целое число. Итак, когда n/2 целое число, то n=2k, x^2+y^2 = 2*k^2. Также оказывается, что решений у этого уравнения столько же, сколько и у уравнения x^2+y^2=k^2 (см. Sloane A046109).

Это также дает простой способ вычисления количества решений для любого n через A046080. Если степени простых чисел в n вида 4k+1 равны f[0]...f[m], то число решений равно 4*product(2f[i]+1 | i in [0.. .м]).

Это позволило мне работать в обратном порядке: 4.product(2f[i]+1 | i in [0...m]) = 420, поэтому product(2f[i]+1 | i in [0...m] ) = 105 = 3*5*7. Я смог придумать эту программу, которая, я думаю, находит сумму всех n в форме 2k и меньше 10 ^ 11, которые имеют 420 точек решетки круга. Ответ (надеюсь!) 257199853438240692.

Вот программа на Си:

#include "stdlib.h"
#include "stdio.h"
#include "math.h"
#include "string.h"

#define lim 1000000000L

char prime[lim];
long primes[50000000];
long len = 0;

int main(void)
{
    long i, j;
    for(i = 0; i < lim; i++)
    {
        prime[i] = 1;
    }

    for(i = 2; i < lim; i++)
    {
        if(prime[i])
        {
            for(j = 2*i; j < lim; j += i) prime[j] = 0;
            if((i-1)%4 == 0)
            {
                prime[i] = 2;
                //printf("%li\n", i);
                primes[len++] = i;
            }
        }

        if(i < 1000 || (i < 10000 && i%1000 == 0) || i%10000 == 0) printf("%li, %li\n", i, len);
    }

    printf("primes!\n");

    long a, b, c, v, total = 0, k;
    for(a = 0; a < len; a++)
    {
        v = primes[a]*primes[a]*primes[a];
        if(v > 50000000000L) break;

        for(b = 0; b < len; b++)
        {
            if(b == a) continue;

            v = primes[a]*primes[a]*primes[a]*primes[b]*primes[b];
            if(v > 50000000000L) break;

            for(c = 0; c < len; c++)
            {
                if(c == a) continue;
                if(c == b) continue;

                v = primes[a]*primes[a]*primes[a]*primes[b]*primes[b]*primes[c];
                if(v > 50000000000L) break;

                for(k = 1; k*v <= 50000000000L; k++)
                {
                    if(prime[k] == 2) continue;
                    total += k*v;
                }
            }
        }
    }

    for(a = 0; a < len; a++)
    {
        v = primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a];
        if(v > 50000000000L) break;

        for(b = 0; b < len; b++)
        {
            if(b == a) continue;

            v = primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[b]*primes[b]*primes[b];
            if(v > 50000000000L) break;

            for(k = 1; k*v <= 50000000000L; k++)
            {
                if(prime[k] == 2) continue;
                total += k*v;
            }
        }
    }

    for(a = 0; a < len; a++)
    {
        v = primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a];
        if(v > 50000000000L) break;

        for(b = 0; b < len; b++)
        {
            if(b == a) continue;

            v = primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[a]*primes[b]*primes[b];
            if(v > 50000000000L) break;

            for(k = 1; k*v <= 50000000000L; k++)
            {
                if(prime[k] == 2) continue;
                total += k*v;
            }
        }
    }

    printf("%li\n", 2*total);


    return 0;
}

Нам просто нужно добавить значения n, которые имеют 420 точек решетки круга и имеют форму 2k+1! Однако это кажется сложнее, чем для n=2k, и я не вижу для этого никакого способа. Я также немного не уверен, правильный ли мой ответ для четного n, поскольку метод довольно запутанный ... Может ли кто-нибудь подтвердить это? Есть ли аккуратный метод без обращения с разными n по-разному?

У меня закончились идеи!


Меня больше всего интересует, как я справляюсь с N=2k+1, поскольку, когда N=2k, я могу поступить так, как предлагает Джон Феминелла.


person Community    schedule 08.03.2009    source источник
comment
Чтобы подтвердить свой ответ, войдите на сайт Эйлера, перейдите к задаче 233 и проверьте свой ответ!   -  person Mitch Wheat    schedule 08.03.2009
comment
Я знаю, но это только часть ответа, поэтому я не могу его проверить! У меня нет полного ответа.   -  person    schedule 08.03.2009


Ответы (3)


Подсказка 1: Радиус круга равен n/√2, что никогда не бывает целым числом для целого числа n, поэтому A046080 никогда не применяется.

Подсказка 2: не пытайтесь перемещать круг. Возьмите его с миллиметровки и просто подумайте о нем, о квадрате, который его определяет, и о еще неизвестных точках интереса на окружности по отношению друг к другу.

Подсказка 3: Угол, вписанный в полуокружность, всегда равен 90 градусам.

Подсказка 4. Сколькими способами можно записать число в виде суммы двух квадратов?

Дополнительный совет, который можно широко использовать повсюду: симметрия!


ВНИМАНИЕ, СПОЙЛЕР!


Не читайте дальше, пока не попробуете разобраться с приведенными выше советами

Если этих подсказок недостаточно, вот некоторые из недостающих шагов для чередования с подсказками выше:

Подсказка 1.5: вам придется изменить свой взгляд на проблему, поскольку подход, который вы использовали, основан на ошибочной предпосылке.

Подсказка 2.5: подумайте о точке решетки на левой стороне дуги между верхними углами квадрата. По симметрии есть еще одна такая точка прямо справа от нее и третья прямо под ней. Что вы можете сказать о расстоянии между этими точками и о треугольнике, который они образуют?

Подсказка 3.5. Как определить, сколько точек решетки находится на левой стороне дуги между верхними углами квадрата для любого заданного n?

person MarkusQ    schedule 13.03.2009
comment
Спасибо; Я ценю ответ! Боюсь, я все еще не понимаю, как действовать дальше. Я целую вечность проводил мозговой штурм и думаю, что точки (x, y) могут лежать в своего рода закономерности в корнях единства. IE: отношение между некоторыми парами может быть постоянным расстоянием по окружности. - person ; 13.03.2009
comment
Еще раз спасибо! :) Для подсказки 2.5: назовите верхнюю левую точку решетки A, правую сторону B и нижнюю точку C. Угол в точке A равен 90 градусов. Если x - координата x точки A, то длина AB = N-2x и AC = √(n^2+4nx-4x^2). Мы также знаем, что BC = √2 n. Хотя, кажется, я не уловил ход твоей мысли... - person ; 14.03.2009
comment
Вы почти поняли. Поднимите уровень абстракции. Это прямоугольный треугольник, все углы — точки решетки, а длина гипотенузы известна. Что вы можете сказать о длине двух других ног сразу, не занимаясь алгеброй? - person MarkusQ; 14.03.2009
comment
Еще раз спасибо! Очевидно, мы можем использовать теорему Пифагора. Если x › 0, то AB ‹ AC ‹ BC. Длины AB и AC тоже целые, но BC никогда не бывает целым. Я пока не вижу смысла. - person ; 15.03.2009
comment
BC не является целым числом, но BC^2 им является, так как это сумма квадратов двух целых чисел. На самом деле мы знаем, что это 2*N^2. Теперь переходим к подсказкам 3.5 и 4... - person MarkusQ; 15.03.2009
comment
Нам нужно найти A с целочисленными координатами, и для каждого 1 ‹= x ‹= N/2 мы могли бы увидеть, является ли √(N^2/4+Nx-x^2)+N/2 целым числом. Однако я уверен, что в какой-то момент мне нужно перестать ссылаться на x и иметь дело только с N. - person ; 15.03.2009
comment
А еще лучше, и связать это с r(), 1+(r(2, 2*N^2)-4)/8 точек решетки, я думаю... Это правильно? - person ; 15.03.2009
comment
@PythonPower - вам нужно найти As или просто определить, сколько их? Что касается комментария r(), я не уверен в вашем выражении (оно не похоже на то, что я получил, хотя может быть эквивалентным), но да, вы на правильном пути. - person MarkusQ; 15.03.2009
comment
Я понял! Спасибо огромное! :D Моя вышеприведенная формула неверна, но у меня есть общая идея и есть ответ. - person ; 15.03.2009
comment
Без проблем. Спасибо за вопрос, в котором немного больше мяса, чем в типичном вопросе, который я не знаю, как кодировать, и я использую .net! - person MarkusQ; 15.03.2009

Подсказка №1. Ваша лемма №2 не совсем верна. Вы уверены, что это радиус?

Подсказка № 2. Ответ тесно связан с функцией суммы квадратов r(k, n). Это дает количество способов представить n с использованием k разных квадратов, допуская нули и различая порядок. Например, r(2, 5) равно 8, потому что существует 8 способов представить 5 с помощью 2 квадратов:

(-2)^2 + (-1)^2
(-2)^2 + 1^2
2^2    + (-1)^2
2^2    + 1^2
... (and the 4 additional expressions produced by reversing these 2 terms)

Вы можете видеть, что круг радиуса p с центром в начале координат имеет r (2, p ^ 2) точек решетки. Например, круг радиусом 5 имеет:

(-4)^2 + (-3)^2
... and 7 others like this

5^2    + 0^2
(-5)^2 + 0^2
0^2    + 5^2
0^2    + (-5)^2

всего 12. Какие числа будут иметь 420 точек решетки круга? Что, если бы они не были сосредоточены в начале координат? Я позволю тебе взять это отсюда.

Если вам нужна гораздо большая подсказка, я rot-13'd (http://rot13.com) кое-что, что вы должны проверить здесь:

uggc://zngujbeyq.jbysenz.pbz/FpuvamryfGurberz.ugzy

person John Feminella    schedule 08.03.2009
comment
Спасибо за указатели. Я все еще не вижу, как действовать дальше. Проблема возникает, когда центр равен (1/2, 1/2) вместо этого... Я не понимаю, как преобразовать его во что-то легко решаемое. Могу ли я получить еще одну подсказку, пожалуйста? :) - person ; 12.03.2009

Вы можете обратиться к http://oeis.org/A046109/b046109.txt, чтобы проверить до 1000. Я установил PARI/GP и использовал один из сценариев PARI здесь: http://oeis.org/A046109 проверить номера выше.

person flcoder    schedule 18.05.2019