2014 dxdy logo

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

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




Начать новую тему Ответить на тему На страницу 1, 2, 3  След.
 
 Проверка что число - куб
Сообщение08.08.2018, 16:05 


05/09/16
12058
При численном переборе вариантов решения великой теоремы Ферма для n=3 в одной из головоломок Ktina-ы понадобилось определять является ли натуральное число точным кубом.

В PARI/GP для этого есть функция ispower(x,{k},{&n}) которая определяет является ли x k-той степенью какого-либа числа и если да, то записывает это число в n.

Но поскольку перебирать надо много, а числа большие (пока речь о числах порядка $10^{15}-10^{20}$), то определение является ли число кубом -- узкое место.

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

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:31 
Заслуженный участник
Аватара пользователя


16/07/14
9145
Цюрих
Методика вполне рабоче-крестьянская: если $k$ - куб, то $k$ - куб по любому модулю. Соответственно выбираем число $n$ и заранее заполняем битовый массив размера $n$ - ставим $1$ в позиции, соответствующие кубам по модулю $n$.
Ну и надо выбрать $n$ так, чтобы доля единичек была поменьше.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:33 


14/01/11
3037
wrest, про сравнения по модулю слышали? Возьмём, к примеру, $7$ в качестве модуля. Тогда
$0^3 \equiv 0 (\mod 7)$,
$1^3 \equiv 1 (\mod 7)$,
$2^3 \equiv 1 (\mod 7)$,
$3^3 \equiv 6 (\mod 7)$,
$4^3 \equiv 1 (\mod 7)$,
$5^3 \equiv 6 (\mod 7)$,
$6^3 \equiv 6 (\mod 7)$.

То есть по модулю $7$ кубы произвольных целых чисел могут принимать всего $3$ значения: $0$, $1$ и $6$.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:42 


05/09/16
12058
Sender в сообщении #1331189 писал(а):
про сравнения по модулю слышали?

Да, но только что и слышал.
Sender в сообщении #1331189 писал(а):
То есть по модулю $7$ кубы произвольных целых чисел могут принимать всего $3$ значения: $0$, $1$ и $6$.

А достаточно посмотреть на таблицу из 6 кубов чтобы сделать такой вывод?
Но ясно: это уменьшает количество проверок на "истинную" кубичность примерно вдвое.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:47 


14/01/11
3037
wrest в сообщении #1331192 писал(а):
А достаточно посмотреть на таблицу из 6 кубов чтобы сделать такой вывод?

Вообще-то их 7. :-) А каков остаток от деления на $7$ числа $(7m+n)^3$, где $0 \leqslant n \leqslant 6$?

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:52 


05/09/16
12058
Sender в сообщении #1331193 писал(а):
Вообще-то их 7. :-) А каков остаток от деления на $7$ числа $(7m+n)^3$, где $0 \leqslant n \leqslant 6$?

А.... :roll: Ну да: после раскрытия скобок семерка будет множителем во всех слагаемых (и остаток там будет ноль) кроме последнего, последнее будет $n^3$ а его мы проверили.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:57 
Заслуженный участник
Аватара пользователя


16/07/14
9145
Цюрих
И дальше нужно найти такое $n$, чтобы число кубических вычетов по модулю $n$ было мало по сравнению с $n$. Почти наверняка есть какая-то высокая теория, позволяющая быстро посчитать количество кубических вычетов по данному модулю, но мне и простого перебора хватило.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 16:59 


27/08/16
10195
Ещё степень двойки в разложении на простые множители можно быстро проверить и отрезать. А если взять несколько независимых небольших модулей, то, скорее всего, они дадут независимые признаки кубичности.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 17:02 
Заслуженный участник


20/08/14
11766
Россия, Москва
Там смысл в этих двух кусочках кода (привожу с сокращениями):
Используется синтаксис C++
//Заполнение массива флагов
const TInt CUBES_MOD = 575757;
std::vector<bool> cubesMod(CUBES_MOD, false);
for (t = 0; t < MAX_T; ++t) cubesMod[(t * t * t) % CUBES_MOD] = true;
//Использование массива флагов
if (!cubesMod[t_target % CUBES_MOD]) continue;//Такое t_target точно не является никаким кубом и извлекать корень не нужно
Т.е. словами, заполняем массив флагов так чтобы он по младшим цифрам числа указывал может ли куб какого-то числа иметь такие младшие цифры. Младшие цифры берутся не десятичные, а по модулю CUBES_MOD, при удачном выборе этого числа количество true в массиве будет сильно меньше количества false и для многих и многих t_target извлекать корень не понадобится.
Можно даже ещё ускорить заведя массив с индексацией по старшим цифрам t_target и содержащий начальное приближение (усечённое вниз) для кубического корня, тогда останется проверить буквально несколько чисел (возведя их в куб и сравнив с t_target). Не уверен, возможно в том коде подобное и сделано через t_pos и lower_bound.

И да, эту технику можно использовать почти в любых местах, хоть для степеней, хоть для произвольных функций. Только величину модуля придётся подбирать каждый раз индивидуально - или плюнуть на незначительное снижение эффективности и взять какое-нибудь простое число. Фактически это напоминает (если не является прямо) хэштаблицы.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 17:40 


05/09/16
12058
В PARI/GP есть непонятные мне функции "модулярной арифметики" -- наверное можно как-то приспособить их?
mihaild в сообщении #1331197 писал(а):
И дальше нужно найти такое $n$, чтобы число кубических вычетов по модулю $n$ было мало по сравнению с $n$.


Ок, хочу убедиться что я правильно понимаю.

Считаем количество вычетов:
Код:
? Vychet(n)=my(v=vector(n,i^3%n));vecsort(v,,8);return(#v);
? Vychet(7)
3
? Vychet(575757)
4095

Для n=7 получается 3 различных вычета (потенциальное ускорение в 2 раза), для n=575757 получается 4095 различных вычетов (ускорение в 140 раз) . Пока верно?

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 17:45 
Заслуженный участник
Аватара пользователя


16/07/14
9145
Цюрих
Да, так. Только ускорение всё же не совсем в 2 раза - поход в массив не бесплатный.
(и плюс не факт, что запросы равномерно распределены по нужному модулю)

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 17:49 


05/09/16
12058
mihaild в сообщении #1331209 писал(а):
Только ускорение всё же не совсем в 2 раза - поход в массив не бесплатный.

Ну, условно.
mihaild в сообщении #1331209 писал(а):
Да, так.

Ok и что дальше?

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 18:05 
Заслуженный участник


16/02/13
4194
Владивосток
Да мало ли чего.
Можно просто довольствоваться ускорением в 140 раз.
Можно подобрать парочку таких чисел и ускориться в $140\times140$ раз или сколько там.
Можно набрать кучу таких чисел и вообще брать кубический корень по модулям, а потом считать число (учтя многозначность корня по модулю).
Вообще, как-то странно: в поле коммплексных чисел кубический корень имеет три значения, а в поле по модулю 575757 — в среднем 140. А может, и не странно.

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 18:09 


05/09/16
12058
iifat в сообщении #1331217 писал(а):
Можно подобрать парочку таких чисел

Они должны быть взаимно-простыми?

 Профиль  
                  
 
 Re: Проверка что число - куб
Сообщение08.08.2018, 18:10 


27/02/09
253
Переводим в double, извлекаем корень третьей степени, округляем его до ближайшего целого, возводим это целое в куб, сравниваем с исходным.

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

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


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

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