2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Количество отрезков в квадратной решетке
Сообщение18.05.2013, 16:42 


16/03/11
31
Мучаюсь с одной олимпиадной задачей, подскажите, в какую сторону копать? Что почитать?

Дана квадратная решетка со стороной N (т.е. множество точек $(x,y)$, таких, что $x,y \in \{0, \ldots, N\}$).
Необходимо найти количество отрезков внутри этой решетки, каждый из которых состоит хотя бы из трёх точек (например, отрезок $\< (5,1), (6,2), (11,7)\>$ подходит).

Можно было бы найти все эти отрезки перебором, но проблема в том, что N -- очень большое, порядка $10^{10}$ степени.

Посоветуйте направление поиска!


Единственное, что я смог придумать, это примерно такое:

Будем искать количество отрезков в прямоугольной решетке $N \times k$ , исходящих из начала координат. Для этого будем переберём все взаимно-простые пары чисел по алгоритму отсюда: https://en.wikipedia.org/wiki/Coprime_integers (раздел "Generating all coprime pairs"). Каждая пара чисел задаёт начало отрезка. Для каждой такой пары $(i,j)$ смотрим, может ли линия $(0,0) - (i,j)$ продолжена дальше до следующих двух, входящей в прямоугольник, точек. Если можно, учитываем эту линию, и считаем количество отрезков на ней.

Теперь, когда мы можем вычислить количество отрезков из начала координат в прямоугольной решетке, можно перейти к общему решению, посчитав количество отрезков в прямоугольнике $(N,1)$, затем $(N, 2)$ и до $(N,N)$.

Проблема, как вы видите, в том, что алгоритм этот кубический, что на больших $N$ сводит всю идею на нет.

Сами отрезки не важны, важно их количество.

Как же решить эту задачу?

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение18.05.2013, 18:01 
Заслуженный участник
Аватара пользователя


06/04/10
3152
Может, через рациональность тангенсов и несократимость выражающих их дробей?

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение18.05.2013, 18:11 
Заслуженный участник


04/05/09
4589
Для каждого подходящего отрезка из начала координат надо просто сразу посчитать количество так же ориентированных отрезков по всему полю - это тривиально.
Не забудьте ещё, что есть отрезки и с другим наклоном, которые нельзя приставить к началу координат.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение19.05.2013, 08:30 
Заслуженный участник


08/04/08
8562
malphunction в сообщении #725455 писал(а):
Необходимо найти количество отрезков внутри этой решетки, каждый из которых состоит хотя бы из трёх точек (например, отрезок $\< (5,1), (6,2), (11,7)\>$ подходит).
Вы считаете именно отрезки или тройки точек, лежащих на одной прямой? Т.е. $\{(5,1), (6,2), (11,7)\}$ и $\{(5,1), (6,2), (7,3)\}$ - это один и тот же отрезок или нет?
И еще, если считаются отрезки, то считаются именно отрезки ненулевой длины? Если 2 из 3-х точек совпадают, то такая тройка задает отрезок? И считаем мы именно отрезки, а не прямые, задаваемые тройкой точек? Т.е. $\{(1,1),(2,2),(3,3)\}$ и $\{(2,2),(3,3),(4,4)\}$ - это разные отрезки?
При $N=2;3;4$ у меня получилось число отрезков $P(N)=6;32;58$. У Вас так?

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение19.05.2013, 11:09 
Заслуженный участник
Аватара пользователя


06/04/10
3152
nikvic в сообщении #725479 писал(а):
Может, через рациональность тангенсов и несократимость выражающих их дробей?

Отдельно можно разобраться с вертикальными и горизонтальными, чуть сложнее - с наклоном 45 градусов.
В качестве основного блюда - прямые с коэфф-м в виде положительных несократимых дробей, меньших единицы. Вот здесь придётся туго, формировать произведения из ряда простых чисел...

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение22.05.2013, 13:58 


16/03/11
31
nikvic в сообщении #725479 писал(а):
Может, через рациональность тангенсов и несократимость выражающих их дробей?


Не понял, как именно? Напишите пример или дайте ссылку, пожалуйста!
Поискал про "рациональность тангенсов", ничего толком не нашел.

-- Ср май 22, 2013 20:59:22 --

venco в сообщении #725484 писал(а):
Не забудьте ещё, что есть отрезки и с другим наклоном, которые нельзя приставить к началу координат.

Да, я этого не учёл, но уже исправил. Сейчас буду писать ответ Sonic86, там расскажу текущее положение дел.

-- Ср май 22, 2013 21:26:06 --

Sonic86 в сообщении #725631 писал(а):
malphunction в сообщении #725455 писал(а):
Необходимо найти количество отрезков внутри этой решетки, каждый из которых состоит хотя бы из трёх точек (например, отрезок $\< (5,1), (6,2), (11,7)\>$ подходит).
Вы считаете именно отрезки или тройки точек, лежащих на одной прямой? Т.е. $\{(5,1), (6,2), (11,7)\}$ и $\{(5,1), (6,2), (7,3)\}$ - это один и тот же отрезок или нет?
И еще, если считаются отрезки, то считаются именно отрезки ненулевой длины? Если 2 из 3-х точек совпадают, то такая тройка задает отрезок? И считаем мы именно отрезки, а не прямые, задаваемые тройкой точек? Т.е. $\{(1,1),(2,2),(3,3)\}$ и $\{(2,2),(3,3),(4,4)\}$ - это разные отрезки?
При $N=2;3;4$ у меня получилось число отрезков $P(N)=6;32;58$. У Вас так?


Я считаю именно отрезки. Из Вашего примера отрезки $\{(5,1), (6,2), (11,7)\}$ и $\{(5,1), (6,2), (7,3)\}$ -- разные. Отрезки нулевой длинны не считаются; если совпадают пара точек, то это не подходящий отрезок. $\{(1,1),(2,2),(3,3)\}$ и $\{(2,2),(3,3),(4,4)\}$ - это разные отрезки, верно.

Для $N = 2$ получается $P(N) = 8$: три вертикальных, три горизонтальных отрезка и две диагонали (отдельная координата измеряется от 0 до 2).

На этой неделе совсем не было время толком об этом подумать, но пока наклёвывается такое решение (отличное от того, что в топике):
  • Перебираем все взаимнопростые числа (по генератору из википедии).
  • Каждая такая пара $(i,j)$ задаёт семейство отрезков.
  • Будем перебирать целые числа $k > 1$ и $p > k$, в результате получаем отрезки $(0,0) - (k*i, k*j)$ и $(0,0) - (p * i, p * j)$, лежащие на одной прямой. Каждый такой "большой" отрезок $(0,0) - (p * i, p * j)$ задаёт прямоугольник (этот отрезок является его диагональю).
  • Осталось найти количество способов расположения прямоугольника в большом квадрате, это тривиально.

Сложность -- $O(N^4)$ (цикл по парам взаимнопростых, цикл по $k$, цикл по $p$), что неприемлемо. Но, вроде бы, удаётся провести оптимизацию: будем перебирать только по $p$, будут получаться прямоугольники, количество расположений на его диагонали средней точки тривиально, без циклов, вычисляется. Итого сложность уже $O(N^3)$, что чуть лучше... Кажется, можно как-то связать взаимно-простую пару $(i,j)$ и возможные значения $p$, если так, то получится $O(N^2)$, ещё лучше! Но когда $N = 10^{11}$ всё равно не то...

P.S. Вообще, я решаю задачку Проекта Эйлера №415, но всё никак не могу придумать вменяемый алгоритм. Я решал несколько задачек из верхней сотни, открывается доступ к обсужденям -- смотришь, и часто бывает, что народ решал задачу на основании каких-то новых мат.разработок, т.к. частенько дают ссылки на диссертации, где решается сходная задача. Это, конечно, раздражает! Получается, задачи можно решать нагугливанием, но для этого надо разбираться в новейших достижениях... Это хорошо для математиков, но я -- просто развлекающийся программист :)

А ещё возникает вопрос этичности, могу ли я обсуждать решение задачи на форумах? Я считаю, что обсуждать направление поиска -- можно, а вот получить готовое решение -- уже неэтично. Поэтому я прошу направление -- где искать, какая область математики?

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение22.05.2013, 15:42 
Заслуженный участник
Аватара пользователя


06/04/10
3152
malphunction в сообщении #727037 писал(а):
[*]Перебираем все взаимнопростые числа (по генератору из википедии).
[*]Каждая такая пара $(i,j)$ задаёт семейство отрезков.

Не только пары. Числитель - $2\cdot 2\cdot 11$, знаменатель - $3\cdot 11\cdot 11\cdot 13$. Важна взаимная простота и относительная "малость", чтобы три точки влезли в Ваш квадрат.

 !  Deggial: замечание за неоформление формул. Формулы поправил.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение23.05.2013, 00:46 


16/03/11
31
Sonic86 в сообщении #725631 писал(а):
При $N=2;3;4$ у меня получилось число отрезков $P(N)=6;32;58$. У Вас так?


$P(2) = 8$, я написал выше, почему.

Теперь случай $N = 3$, это квадрат со стороной в $4$ точки. В нём четыре вертикали, четыре горизонтали, две диагонали из 4-ёх точек и 4 "поддиагонали" из трёх точек. Из четырех точек три можно выбрать $C^3_4 = 4$ способами. Итого, вертикали, горизонтали и диагонали задают $(4 + 4 + 2) \cdot 4 = 40$ отрезков, каждая "поддиагональ" -- один отрезок, т.е. поддиагонали задают 4 отрезка. Итого $P(3) = 44$.

Случай $N = 4$, тут уже появляются более пологие отрезки, например, $(0,0) - (2,1) - (4,2)$. Сейчас попробую посчитать, сколько их всего.

Итак, есть пять вертикалей и горизонталей и две главные диагонали, в каждой по пять точек. Три точки можно выбрать $C^3_5 = 10$-ю способами. Итого $(5 + 5 + 2) \cdot 10 = 120$ отрезков. Непосредственно к главным диагоналям прилегают четыре поддиагонали из четырёх точек, $4 \cdot C^3_4 = 16$ отрезков. К этим поддиагоналям прилегают ещё 4 "под-поддиагонали" длиной 3 точки, они задают ещё 4 отрезка. Итого $120 + 16 + 4 = 140$ отрезков. Теперь считаем "косые" отрезки вида $(0,0) - (2,1) - (4,2)$. Такой отрезок можно два раза вверх сдвинуть. Итого 3 отрезка. Отразим по вертикали -- ещё 3 отрезка. Теперь то же самое, но с отрезками вида $(0,0) - (1,2) - (2,4)$, ещё 6. Окончательно, $P(4) = 152$. Вроде, всё посчитал.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение23.05.2013, 00:58 
Заслуженный участник


16/02/13
4214
Владивосток
Скорее уж, имхо, напрячься и попробовать вывести рекуррентное соотношение. Вот есть квадрат со стороной $N$, в котором $P(N)$ отрезков. Увеличиваем на $1$ — сколько их станет?

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение23.05.2013, 01:10 


16/03/11
31
iifat в сообщении #727356 писал(а):
Скорее уж, имхо, напрячься и попробовать вывести рекуррентное соотношение. Вот есть квадрат со стороной $N$, в котором $P(N)$ отрезков. Увеличиваем на $1$ — сколько их станет?


Скорее всего, так и нужно, такая формула даёт шансы на $O(N)$.

Но пока безуспешно...
Пусть мы посчитали $P(N)$, и сохранили с этого рассчёта все отрезки. Считая $P(N + 1)$, мы можем просто продолжить их (точнее, некоторые из них, ведь не все могут быть продолжены). Но, кроме них, с шага $N$ ещё нужно будет захватить пары точек, т.к. на шаге $N + 1$ они могут образовать нужные нам тройки... Ну и т.д., короче, пока рекуррентное соотношение не получается. Ещё я пробовал через удваивание (от $P(N)$ перейти к $P(2\cdot N)$), но тоже глухо...

Видимо, надо рассматривать сразу несколько предшествующих значений, но этим я ещё не успел заниматься.

-- Чт май 23, 2013 08:44:53 --

nikvic в сообщении #727064 писал(а):
malphunction в сообщении #727037 писал(а):
[*]Перебираем все взаимнопростые числа (по генератору из википедии).
[*]Каждая такая пара $(i,j)$ задаёт семейство отрезков.

Не только пары. Числитель - 2*2*11, знаменатель - 3*11*11*13. Важна взаимная простота и относительная "малость", чтобы три точки влезли в Ваш квадрат.


Не очень понял Ваше замечание про эту пару чисел. Если рассмотреть отрезок $(0,0) - (2 \cdot 2 \cdot 11, 3 \cdot 11 \cdot 11 \cdot 13)$, то он проходит через точку $(0,0) - (2 \cdot 2, 3 \cdot 11 \cdot 13)$, поэтому не является "образующим" для моего алгоритма.

Точки перебираем, разумеется, так, чтобы они влезали в квадрат, поэтому перебираем $(i,j)$ так, чтобы $i < N / 2, j < N / 2$, тогда пара отрезков $(0,0) - (i,j) - (2 \cdot i, 2 \cdot j)$ будут внутри квадрата.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение23.05.2013, 02:00 
Заслуженный участник


16/02/13
4214
Владивосток
Ну, вот так, сходу: в $P(N+1)$ входят отрезки
    — входящие в $P(N)$
    — входящие в $P(N)$, правый конец лежит на правой границе (их можно сдвинуть вправо)
    — входящие в $P(N)$, верхний конец лежит на верхней границе (их можно сдвинуть вверх)
    — никак не входящие в $P(N)$ — те, что идут отлевой до правой либо от верхней до нижней границы
Возможно, получится понять систему из двух рекуррентных последовательностей — количество всех отрезков и количество отрезков с правым концом на правой грани.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение23.05.2013, 03:12 


16/03/11
31
iifat в сообщении #727360 писал(а):
Ну, вот так, сходу: в $P(N+1)$ входят отрезки
    — входящие в $P(N)$
    — входящие в $P(N)$, правый конец лежит на правой границе (их можно сдвинуть вправо)
    — входящие в $P(N)$, верхний конец лежит на верхней границе (их можно сдвинуть вверх)
    — никак не входящие в $P(N)$ — те, что идут отлевой до правой либо от верхней до нижней границы
Возможно, получится понять систему из двух рекуррентных последовательностей — количество всех отрезков и количество отрезков с правым концом на правой грани.


Я дополню:

Пусть мы получили все отрезки, входящие в $P(N)$. Перейдём теперь к $P(N+1)$. Ясно, что исходный квадратик размера $N$ можно расположить в квадрате $N + 1$ четырьмя способами. Таким образом, $P(N+1) = 4 \cdot P(N) + ?$, где $?$ -- дополнительные отрезки. Эти дополнительные отрезки следующие:
  • которые в исходном квадратике состояли из двух точек, а теперь их можно продлить. Например, были две точки $\{(N-1, 0), (N,1)\}$, то в квадратике $N+1$ можно добавить к ним точку $(N+1,2)$, и появится новый отрезок. Заметьте, этот отрезок порождается семейством взаимнопростых чисел $(1,1)$, но таких семейств, получивших возможность расшириться, может быть больше, это надо как-то учитывать, причём так, чтобы два раза не считать одни и те же отрезки.
  • в исходном квадратике линия, соответствующая отрезку, включала $m$ точек, а за счёт расширения стало $m + 1$. Например, был у нас квадратик размером 3, и в нём были 3 вертикальных отрезка. Рассмотрим такую вертикальную линию $(0,0)-(0,2)$. На ней в 3-квадратике помещается 1 трёхточечный отрезок. Расширим до 4-х точек. Уже помещается 4 отрезка! (см. мои рассчёты выше). Но не каждый отрезок расширяется при переходе от N к N+1, например, посмотрите мой рассчёт для $N=5$, там фигурировал отрезок $(0,0)-(2,1)-(4,2)$. При расширении квадрата на 1 он не получит продолжения, зато при расширении на 2 -- получит.
  • отрезки с новыми углами: например, мы переходим к $N + 1 = 2\cdot p$, где $p$ -- некое простое число. Тогда появится возможность разместить новые отрезки вида $(0,0) - (i,p) - (2 \cdot i, 2\cdot p)$.

Как все такие особенности учитывать в рекуррентном соотношении -- непонятно. Даже не так. Можно такое рекуррентное соотношение составить, пользуясь результатами предыдущих вычислений, и его вычисление вроде даже линейным будет, но тогда потребуется $O(N^2)$ памяти, что неприемлемо.

Видимо, как-то можно упростить эти соотношения, но я ещё не успел придумать, как.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение23.05.2013, 03:43 
Заслуженный участник


16/02/13
4214
Владивосток
malphunction в сообщении #727363 писал(а):
Например, были две точки $\{(N-1, 0), (N,1)\}$, то в квадратике $N+1$ можно добавить к ним точку $(N+1,2)$,

Это учтено. Либо $N\ge2$ и присутствовал отрезок $\{(N-2, 0), (N,2)\}$, который можно сдвинуть на 1 вправо (п.2 у меня), либо $N=1$ и новый отрезок идёт с левого до правого конца (п.4).
malphunction в сообщении #727363 писал(а):
в исходном квадратике линия, соответствующая отрезку, включала $m$ точек, а за счёт расширения стало $m + 1$
Опять же, учтено: новый отрезок не помещался в $N\times N$, значит, он идёт от левого до правого конца (либо сверху донизу).
malphunction в сообщении #727363 писал(а):
отрезки с новыми углами
Таки аналогично предыдущему: описанный вами отрезок пойдёт от левого до правого конца.
Единственное, что сообразил — не две, а три рекуррентных последовательности: всего отрезков, количество отрезков, идущих до правого края, идущих до верху (совпадает с предыдущим) и отрезки, идущие до правой верхней вершины.

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение25.05.2013, 14:47 
Заслуженный участник


02/08/10
629
malphunction в сообщении #725455 писал(а):
Мучаюсь с одной олимпиадной задачей, подскажите, в какую сторону копать? Что почитать?

Дана квадратная решетка со стороной N (т.е. множество точек $(x,y)$, таких, что $x,y \in \{0, \ldots, N\}$).
Необходимо найти количество отрезков внутри этой решетки, каждый из которых состоит хотя бы из трёх точек (например, отрезок $\< (5,1), (6,2), (11,7)\>$ подходит).

Можно было бы найти все эти отрезки перебором, но проблема в том, что N -- очень большое, порядка $10^{10}$ степени.

Посоветуйте направление поиска!

Как же решить эту задачу?


Можно источник задачи?
Я знаю решение за $O(n\ln{n})$ и вроде как за $O(n)$

 Профиль  
                  
 
 Re: Количество отрезков в квадратной решетке
Сообщение26.05.2013, 09:35 


16/03/11
31
MrDindows в сообщении #728244 писал(а):
Можно источник задачи?
Я знаю решение за $O(n\ln{n})$ и вроде как за $O(n)$


Это задача 415 из Project Euler. А что у Вас за решение?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 27 ]  На страницу 1, 2  След.

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Gagarin1968


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group