All streams
Search
Write a publication
Pull to refresh
152
0
Иван Бессонов @ibessonov

Математик, программист

Send message

Вариация действительно превосходная, пришлось хорошо подумать, чтобы решить. Я снова предполагаю, что массив заполнен 32-битными целыми числами, но решение масштабируется на числа любой длины. Исхожу из предположения, что "фиксированное количество памяти" в данном случае можно расценить как "могу позволить себе 33 переменных".
Для начала понадобится один проход по массиву:


  • нужно посчитать xor всего массива;
  • вместе с ним нужно посчитать xor величин, равных конъюнкции элементов массива с их циклическими сдвигами на 1 (т.е. x & ((x >>> 1) | (x << 31)), где x — элемент массива).

Дальше идёт хитрая часть вычислений. Раз неизвестных чисел два и они различны, то есть как минимум один бит, который у данных чисел будет разным (ну это очевидно).
Возьмём бит a1 для первого числа и b1 для второго (с той же позиции). Тогда наши два вычисления дают следующие результаты:


  • c1 = a1 XOR b1;
  • c2 = a2 XOR b2 (соседние биты для a1 и b1);
  • d = (a1 & a2) XOR (b1 & b2).

Сразу стоит оговориться, что поменяв местами значения a и b, решением эта пара быть не перестанет. Значит в какой-то момент нам просто нужно будет случайным образом решить, что есть a, а что есть b. Так, для порядка.
Учитывая данную симметрию, проследим, какими могут быть значения c1, c2 и d:


a1 a2 b1 b2 | c1 c2 d
0  0  0  0  | 0  0  0
0  0  0  1  | 0  1  0
0  0  1  0  | 1  0  0
0  0  1  1  | 1  1  1
0  1  0  1  | 0  0  0
0  1  1  0  | 1  1  0
0  1  1  1  | 1  0  1
1  0  1  0  | 0  0  0
1  0  1  1  | 0  1  1
1  1  1  1  | 0  0  0

В четырёх случаях из данного списка все значения c1, c2 и d оказались нулями — это именно те случаи, где a1 == b1 && a2 == b2, то есть нас они не интересуют. Для остальных случаев тройка {c1, c2, d} однозначно определяет значения {a1, a2, b1, b2}.


Дальше дело за малым — пара различных бит — это либо {a1, b1}, либо {a2, b2}. Без ограничения общности будем считать, что это {a1, b1}. Теперь мы в праве вычислить e = (a1 & a3) XOR (b1 & b3) (тут циклическое смещение на два) и т.д. для всех длин циклического смещения, достраивая полноценные значение a и b бит за битом.


Конечно, данное решение будет засчитано только если верно моё предположение о том, что разрядность чисел можно считать константой. Если это не так, то варианта получше у меня пока нет.

Позвольте не согласиться =) Я на Java писал, там с этим строго.

Если посмотреть на подобный код в библиотечных реализациях в том же классе Long, то там каждый такой метод снабжён комментарием вида // HD, Figure 7-1 (согласно документации это ссылка на главу книги с подробным описанием).
Данный конкретный способ был взят из головы. Если и есть классическое название, то я с ним не знаком.

Так или иначе, всё сводится к нахождению закономерности, которая числу 3 сопоставляет число 37.
И это всё, что о ней известно, поэтому остаётся только угадывать. Не лучший способ решения математических задач. Это как если бы я попросил продолжить последовательность 1, 2…
Вот что должно быть дальше?
Вы уверены, что задача имеет однозначное решение?
С ходу можно сказать, что 3·n = 37*n. Отсюда ясно, что как минимум коммутативности тут нет. Что же делать, когда слева единица — непонятно.
Допустим, что коэффициент равен наибольшему простому числу, которое можно получить приписыванием цифры справа (что не всегда возможно), т.е. для 1 это 19, для 2 — 29, для 3 — 37, для 4 — 47 и т.д. В таком случае 1·1=19, но могут быть и другие варианты.
37 = 1001012
Можно предположить, что для 4 было бы 10001001012, а для 1 — 12. Тогда ответ был бы просто 1…
Я говорю о методе, который описан в 1-м комментарии. В нём появляется система линейных уравнений — матрица этой системы и имеется ввиду.

Вы описываете другой метод и матрица в нём появляется другая и из иных соображений. В вашем методе определитель может быть и нулевым, ведь систему там решать не надо. При этом процесс вывода у вас сложнее (надо приводить к жордановой форме, а для этого надо как минимум знать, что это такое).
Ну так всё просто.
Представьте последовательность Fn=2*Fn-1-Fn-2, F0 = 0, F1 = 1.

Возможно вы удивитесь, попробовав её перечислить: 0, 1, 2, 3, 4, 5, 6…
Это как раз случай, когда λ12=1 и матрица системы уравнений является вырожденной. Формулу Fn=n в виде суммы показательных функций не выразить.
Это к слову о том, зачем нужен определитель. В моём методе без него не выйдет.

Что же касается возведения матрицы в степень, то да, там для любой последовательности формула выводится, с этим никто не спорит. Просто путь до неё посложнее будет.
Да, любая рекуррентная последовательность заданного вида будет выражаться такой линейной комбинацией. Единственное исключение — это когда λ1 и λ2 совпадают.
Доказывается это тем, что определитель в матрице соответствующей системы уравнений будет ненулевым, а значит система всегда разрешима и полученное решение удовлетворяет изначальным условиям.
Более того, данный подход легко масштабируется на большее число слагаемых в рекуррентной формуле, просто уравнение получится не квадратным а большей степени.
Здравствуйте!
Задача по виду очень похожа на вывод общей формулы для чисел Фибоначчи и для неё нам в универе давали намного более простой вывод.

Если отбросить начальный условия (F0=0, F1=10), то в качестве формулы решения можно попробовать рассмотреть Fn = λn для некоторой константы λ. Уравнение на неё строится следующим образом:

λn=3λn-1-2λn-2

Оно далее упрощается и быстро решается (по той же теореме Виета):

λ2-3λ+2=0
λ1=2, λ2=1

Мы нашли две подходящие последовательности. Не сложно заметить, что любая их линейная комбинация будет удовлетворять изначальному рекуррентному соотношению, а значит решение представимо в следующем виде:

Fn = aλ1n + bλ2n

Если подставить начальные условие, то получается система линейных уравнений:

F0 = 0 = a + b
F1 = 10 = aλ1 + bλ2

Если её решить, то получается тот же ответ, что и у вас:

a = 10, b = -10
Fn = 10*2n-10*1n = 10(2n-1)
Большой разницы между вашим примером для BiFunction… и моим для f2 я не вижу

Возможно я выразился немного запутано, позвольте объяснить подробнее.
Функция f2 в вашем примере является двуместной, об этом говорит запятая в списке её аргументов. Будь она каррированной, у неё был бы всего один параметр.


Более формально — пусть у вас есть функция f : (A x B) -> R (где A x B — декартово произведение).
Каррированная её версия являлась бы отображением g : A -> (B -> R), то есть функцией одного аргумента, результатом работы которой тоже является функция одного аргумента. Такого вида функции как раз часто встречаются в функциональных языках.

Есть у меня несколько замечаний.


Наверняка вы слышали о карринге — методе преобразования функции с N параметрами в функции с N + 1 параметрами

Кажется вы не понимаете, что такое "карринг". В Java он выглядел бы, например, как представление объекта BiFunction<X, Y, R> в виде Function<X, Function<Y, R>>. Такой финт позволяет реализовать любую арность только через интерфейс Function.
Ну а ваш пример с f2(f1(x), y) неверен. Да и дальше по тексту карринг нигде не упоминается.


прийти к этому решению рациональным путем просто невозможно

Не соглашусь. Выражать функции 3-х аргументов с помощью методов с 3-мя параметрами это наиболее рациональная и очевидная вещь, какую только можно сделать. Документация подобные факты упоминать не будет по тем же причинам — это и так должно быть очевидно.


трехарных

Тернарных.

Мне кажется вас не об этом спросили. Вам знакомо понятие «связное множество»?
Пустите свою «качественную энергию» в штудирование учебника физики за 8-й класс общеобразовательной школы.
она не может находится в абсолютном покое по определению

Энергия — это количественная характеристика. У неё нет движения и направления. Это скалярная величина. Не позорьтесь.

И ответьте на остальные мои вопросы, мне правда интересно, что такое «абсолютное значение длины кванта энергии».
Что вы вообще несёте?

измененное определение из википедии
Нельзя просто так брать и подменять понятия. Скажите, пожалуйста, что такое величина третьего порядка? В википедии, из которой вы брали текст, в самом начале написано, что энергия — величина скалярная.

2 — это абсолютное значение длины кванта энергии
Создаётся впечатление, что вы вообще не понимаете, о чём пишете, вот честно. Какая ещё длина кванта, если он должен быть в Джоулях? Что ещё за абсолютное значение длины? В каких единицах оно измеряется? Причём тут все ваши тригонометрические выражения и какой физический смысл вы хотите им придать?

С коверканья математики вы переключились на коверканье физики. Такой неорганизованный поток сознания попросту неприятно читать. Разберитесь, пожалуйста, в своих мыслях и только после этого постарайтесь внятно, корректно и последовательно их высказать. Сейчас же невозможно понять: что всё это такое? Для чего написано? Создаётся впечатление, что вы намеренно опубликовали бредовую статью, чтобы проверить у местной публики наличие здравого смысла.
Справедливо. Но что такое «непрерывная функция» всё-таки советую узнать, как и про разницу между аксиомой и теоремой.
Здравствуйте, а почему бы не изучить настоящее определение многозначных/многолистных функциий (тех, что описывают комплексный логарифм и прочие классные вещи)?
То, что вы тут представили, даже близко не тянет на математический формализм.

малые изменения аргумента приводят к малым изменениям значения функции
И что означает ваше «определение» непрерывности? Больше похоже на равномерную непрерывность, которая является более сильным понятием.

Пожалуйста, ознакомьтесь сперва с соответствующей литературой и не изобретайте велосипеды.

Тут вы меня поймали!

Если я упустил какой-то из способов, то расскажите :)

Конструктор java.lang.Class — это лишь предлог, для любого другого класса изложение закончилось бы уже в первой части.
Настоящая цель должна быть понятна из содержания — исследование способов динамического инстанцирования объектов. Откинув абсурдную шестую часть, остаются реально используемые варианты:


  • JNI вызов;
  • MagicAccessorImpl;
  • Unsafe.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Пишу базу данных
Lead
Java
High-loaded systems