Иван Бессонов @ibessonov
Математик, программист
Information
- Rating
- Does not participate
- Location
- Санкт-Петербург, Санкт-Петербург и область, Россия
- Date of birth
- Registered
- Activity
Specialization
Пишу базу данных
Lead
Java
High-loaded systems
Математик, программист
Вариация действительно превосходная, пришлось хорошо подумать, чтобы решить. Я снова предполагаю, что массив заполнен 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
:В четырёх случаях из данного списка все значения
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
бит за битом.Конечно, данное решение будет засчитано только если верно моё предположение о том, что разрядность чисел можно считать константой. Если это не так, то варианта получше у меня пока нет.
Если посмотреть на подобный код в библиотечных реализациях в том же классе
Long
, то там каждый такой метод снабжён комментарием вида// HD, Figure 7-1
(согласно документации это ссылка на главу книги с подробным описанием).Данный конкретный способ был взят из головы. Если и есть классическое название, то я с ним не знаком.
И это всё, что о ней известно, поэтому остаётся только угадывать. Не лучший способ решения математических задач. Это как если бы я попросил продолжить последовательность 1, 2…
Вот что должно быть дальше?
С ходу можно сказать, что 3·n = 37*n. Отсюда ясно, что как минимум коммутативности тут нет. Что же делать, когда слева единица — непонятно.
Допустим, что коэффициент равен наибольшему простому числу, которое можно получить приписыванием цифры справа (что не всегда возможно), т.е. для 1 это 19, для 2 — 29, для 3 — 37, для 4 — 47 и т.д. В таком случае 1·1=19, но могут быть и другие варианты.
37 = 1001012
Можно предположить, что для 4 было бы 10001001012, а для 1 — 12. Тогда ответ был бы просто 1…
Вы описываете другой метод и матрица в нём появляется другая и из иных соображений. В вашем методе определитель может быть и нулевым, ведь систему там решать не надо. При этом процесс вывода у вас сложнее (надо приводить к жордановой форме, а для этого надо как минимум знать, что это такое).
Представьте последовательность Fn=2*Fn-1-Fn-2, F0 = 0, F1 = 1.
Возможно вы удивитесь, попробовав её перечислить: 0, 1, 2, 3, 4, 5, 6…
Это как раз случай, когда λ1=λ2=1 и матрица системы уравнений является вырожденной. Формулу Fn=n в виде суммы показательных функций не выразить.
Это к слову о том, зачем нужен определитель. В моём методе без него не выйдет.
Что же касается возведения матрицы в степень, то да, там для любой последовательности формула выводится, с этим никто не спорит. Просто путь до неё посложнее будет.
Доказывается это тем, что определитель в матрице соответствующей системы уравнений будет ненулевым, а значит система всегда разрешима и полученное решение удовлетворяет изначальным условиям.
Более того, данный подход легко масштабируется на большее число слагаемых в рекуррентной формуле, просто уравнение получится не квадратным а большей степени.
Задача по виду очень похожа на вывод общей формулы для чисел Фибоначчи и для неё нам в универе давали намного более простой вывод.
Если отбросить начальный условия (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)
Возможно я выразился немного запутано, позвольте объяснить подробнее.
Функция
f2
в вашем примере является двуместной, об этом говорит запятая в списке её аргументов. Будь она каррированной, у неё был бы всего один параметр.Более формально — пусть у вас есть функция
f : (A x B) -> R
(гдеA x B
— декартово произведение).Каррированная её версия являлась бы отображением
g : A -> (B -> R)
, то есть функцией одного аргумента, результатом работы которой тоже является функция одного аргумента. Такого вида функции как раз часто встречаются в функциональных языках.Есть у меня несколько замечаний.
Кажется вы не понимаете, что такое "карринг". В Java он выглядел бы, например, как представление объекта
BiFunction<X, Y, R>
в видеFunction<X, Function<Y, R>>
. Такой финт позволяет реализовать любую арность только через интерфейсFunction
.Ну а ваш пример с
f2(f1(x), y)
неверен. Да и дальше по тексту карринг нигде не упоминается.Не соглашусь. Выражать функции 3-х аргументов с помощью методов с 3-мя параметрами это наиболее рациональная и очевидная вещь, какую только можно сделать. Документация подобные факты упоминать не будет по тем же причинам — это и так должно быть очевидно.
Тернарных.
Энергия — это количественная характеристика. У неё нет движения и направления. Это скалярная величина. Не позорьтесь.
И ответьте на остальные мои вопросы, мне правда интересно, что такое «абсолютное значение длины кванта энергии».
Нельзя просто так брать и подменять понятия. Скажите, пожалуйста, что такое величина третьего порядка? В википедии, из которой вы брали текст, в самом начале написано, что энергия — величина скалярная.
Создаётся впечатление, что вы вообще не понимаете, о чём пишете, вот честно. Какая ещё длина кванта, если он должен быть в Джоулях? Что ещё за абсолютное значение длины? В каких единицах оно измеряется? Причём тут все ваши тригонометрические выражения и какой физический смысл вы хотите им придать?
С коверканья математики вы переключились на коверканье физики. Такой неорганизованный поток сознания попросту неприятно читать. Разберитесь, пожалуйста, в своих мыслях и только после этого постарайтесь внятно, корректно и последовательно их высказать. Сейчас же невозможно понять: что всё это такое? Для чего написано? Создаётся впечатление, что вы намеренно опубликовали бредовую статью, чтобы проверить у местной публики наличие здравого смысла.
То, что вы тут представили, даже близко не тянет на математический формализм.
И что означает ваше «определение» непрерывности? Больше похоже на равномерную непрерывность, которая является более сильным понятием.
Пожалуйста, ознакомьтесь сперва с соответствующей литературой и не изобретайте велосипеды.
Тут вы меня поймали!
Если я упустил какой-то из способов, то расскажите :)
Конструктор
java.lang.Class
— это лишь предлог, для любого другого класса изложение закончилось бы уже в первой части.Настоящая цель должна быть понятна из содержания — исследование способов динамического инстанцирования объектов. Откинув абсурдную шестую часть, остаются реально используемые варианты:
MagicAccessorImpl
;Unsafe
.