Я бы сделал нормальную статическую переменную (свойство) в отдельном классе ReflectionCache. Так проще и понятнее, и работает как надо. Стараюсь избегать использования статических переменных внутри функций, как раз из-за таких возможных багов.
Скрытый текст
class ReflectionCache {
static $counts;
public static function incrementCount($key) {
if (!isset(self::$counts[$key])) self::$counts[$key] = 0;
++self::$counts[$key];
return self::$counts[$key];
}
}
class A {
function printCount() {
printf("%s: %d\n", get_class($this), ReflectionCache::incrementCount(static::class));
}
}
class B extends A {
function printCount() {
parent::printCount();
}
}
$a = new A();
$b = new B();
$a->printCount(); // A: 1
$a->printCount(); // A: 2
$b->printCount(); // B: 1
$b->printCount(); // B: 2
$b->printCount(); // B: 3
Этот прием и есть перебор. Вы увеличиваете k каждый раз на единицу, при этом у вас результат уравнения Dk — ak^2 меняется на константу. Хм, пожалуй здесь даже производной нет, здесь просто разность 2 квадратов, так как дискриминант должен быть квадратом целого числа. Поэтому квадратичные зависимости у вас сокращаются, остается линейнaя часть.
D > a^2, D = (a+c)^2 (a+c)^2 - a^2 = 2ac + c^2
Таблица разности квадратов b^2 - a^2 для чисел от 0 до 10. Линейные зависимости хорошо заметны.
Использование модуля 2 не обеспечивает возможность проведения анализа вычислений, так как при этом не обеспечивается определенность формализованного выражения числа.
Вы взяли модуль больше, при этом у вас стало больше таблиц. То, что вы стали меньше считать руками для одной конкретной таблицы, не означает, что у вас поменялся принцип. Кроме того, одно и то же число N может появляться в разных диагонялях (напр. 106). Это значит, что точного решения нет, есть множество решений. А значит и азимута нет.
Чтобы иметь вероятность, найти такой способ, необходимо иметь программу, позволяющую читать расчёты
Если есть такой способ, он может быть найден алгоритмически, без программ. Ну и у вас слишком запутанные объяснения. Чтобы написать программу, надо понимать каждый шаг алгоритма, который в нее надо заложить.
Ок, давайте так. Вот есть число 4123. Оно относится к первой таблице. Напишите пожалуйста все вычисления, необходимые для того, чтобы найти его координаты в таблице, ничего не сокращая и не пропуская — все формулы, ряды дискриминантов и корректирующих величин для модулей 6 и 4, и т.д. Один шаг — одно изменение.
У вас нет перевода квадратичных зависимостей в линейные, потому что это принципиально невозможно. Вы делаете расчеты через приращения, это производная, и естественно, что для квадратного уравнения она линейная. (ax^2 + bx + c)' = 2ax + b
В общем, выкладываю суть методики автора, которая описана в файле «Числа — типография 1.doc», насколько я ее понял. Может кому-то будет интересно. Файл находится в архиве, который выложен в этом комментарии.
Разобрался не во всем, так как в описании сокращаются шаги вычислений, кое-где пропущены константы в записи уравнений (хоть они и учитываются в решении), присутствуют ссылки на то, что подробно описано ниже по тексту, и т.д.
Если коротко, то никакой сенсации нет, хотя рациональное зерно присутствует.
Все целые числа L можно представить как 6N + r. Остаток r может быть от 0 до 5 (или можно представить как от -3 до 2)
Интерес представляют только 6N + 1 и 6N + 5 (которое автор обозначает как 6N — 1), так как делимость остальных групп легко определить.
6N + 0 6N + 0 делится на 2
6N + 1 6N + 1 ?
6N + 2 6N + 2 делится на 2
6N + 3 6(N+1) - 3 делится на 3
6N + 4 6(N+1) - 2 делится на 2
6N + 5 6(N+1) - 1 ?
// или в более симметричном виде
6N - 3 делится на 3
6N - 2 делится на 2
6N - 1 ?
6N + 0 делится на 2
6N + 1 ?
6N + 2 делится на 2
6N + 3 делится на 3
Все варианты L для группы чисел 6N + 1 можно записать в виде (6x+1)*(6y+1) и (6x-1)*(6y-1)
L = (6x+1)(6y+1) = 36xy + 6x + 6y + 1 = 6(6xy + x + y) + 1
N = 6xy + x + y
L = (6x-1)(6y-1) = 36xy - 6x – 6y + 1 = 6(6xy – x - y) + 1
N = 6xy - x - y
Это таблицы A и B. Например, таблица A (в ячейках находятся значения N):
Таблицы C и D для вариантов (6x+1)(6y-1) и (6x-1)(6y+1) (группа 6N — 1) строятся аналогично.
Если брать значения x и y больше 0, то все числа вида L = (6x+-1)(6y+-1) являются составными, так как получается произведение 2 чисел больше единицы. Значит, в этих 4 таблицах находятся все составные числа. Для проверки числа надо найти его номер N и проверить, есть ли он в какой-то из этих таблиц. Если нет, значит число простое.
Дальше производятся всякие действия, направленные на получение информации из этого N и на связь ее с этими 4 таблицами
Скрытый текст
Уравнение L = 6(6xy + x + y) + 1 представляется в виде L = (3(х + у) + 1)^2 - (3(у – х))^2
из него выделяются Q = (y + x) и q = (y - x)
находятся минимально возможные значения Qmin и qmin
Qmin >= ceil(sqrt(L) - 1)
qmin >= ceil(L - (Qmin + 1)^2)
которые в итоге сводятся к уравнению N = 6 * ((6k+Qmin - d-qmin)/2) * ((6k+Qmin + d+qmin)/2) + Qmin + 6k
Подставляются известные значения, остается квадратное уравнение с неизвестными d и k, d выражается через k, и дальше методом подбора ищется такое k, чтобы дискриминант был точным квадратом.
Для ускорения перебора автор добавляет расчеты по модулю 4, но по факту они особо не нужны. Этот перебор вариантов никак не ограничен, надо проверить все возможные значения, при которых дискриминант больше или равен 0.
Скрытый текст
… Методом подбора находим такое значение k, чтобы Дискриминант был равен точному квадрату.
… Обычно такие уравнения решаются путем подбора величины k
… При исследовании числа в любой из таблиц нам необходимо составить числовой ряд возможных Дискриминантов (для разных k) и, параллельно, числовой ряд точных квадратов. Общий для обоих этих рядов результат и будет искомым D.
… где k 1 – количество просчетов, необходимое для получения D, равного точному квадрату.
________
Я не знаю, зачем вы привязались к модулю 6. Все можно сделать гораздо проще.
Числа вида (6x+-1)(6y+-1) это просто произведение нечетных чисел, и можно использовать стандартное обозначение 2n+1.
Формулы будут аналогичные, они работают одинаково для любого модуля.
L = (2x+1)*(2y+1) = 4xy + 2x + 2y + 1 = 2(2xy + x + y) + 1
N = (2xy + x + y)
Таблица в этом случае получается одна. По ней можно проверить на простоту только нечетное число, но четные проверяются тривиально.
С одной стороны все просто. Например, число 17. L = 17 = 2*8 + 1; N = 8. Числа 8 в таблице нет, значит число 17 простое.
Но вот, например, число 2219, N = 1109. Оно есть в таблице или нет? В общем случае, даже строку, столбец, или диагональ нельзя определить. Оно может быть далеко в 1 строке, или близко в 10.
Может эту таблицу и можно как-то использовать для ускорения расчетов, но у меня не получилось найти такой способ.
Всегда есть 2 неизвестных, одну из которых надо перебирать. При расчете через арифметические прогрессии в диагоналях получилась, например, такая формула: x0 = ((N - n) / (2*n + 1)) - n
Скрытый текст
3 строка, 158 элемент, 3 + 158*(+7) = 1109
x = 3, y = 158, N = 2*3*158 + 3 + 158 = 1109
L = (2x+1)*(2y+1) = 7*317 = 2219
То есть я правильно понимаю, для точного определения, является число простым или нет, надо перебрать все возможные значения дискриминантов, которые больше или равны 0?
что обеспечивает увеличение интервала просчёта с 6 до 24.
Это никакой практической роли не играет, особенно при использовании машинных вычислений. Если у нас 20-значное число, нет большой разницы, делать ли 10^20 / 6 шагов или 10^20 / 24, все равно получается много.
Методика позволяет осуществлять расчёты для конкретного диапазона значений
Это самый непонятный момент в вашей методике. Как определяется начало диапазона?
Я кажется нашел, в чем у вас ошибка. В файле «Числа — типография 1.doc» вы пишете:
Решаем эти уравнения относительно γ, переменная k при этом выделяется в Дискриминант. Путем подбора k находим D, являющийся точным квадратом.
Так вот подбор k и есть замена перебора множителей. У вас никак не ограничены ни его размер, ни число шагов для его нахождения. Чем больше исходное число, тем больше будут коэффициенты в уравнении, и тем больше надо проверить вариантов числа k.
Кроме сказанного, отмечу: «Замысел ещё не точка» и «Один в поле не воин»
Какая разница, воин или не воин. Вы пишете:
По каждому из вариантов расчета составлена программа, использующая возможности таблиц Excel.
По данной методике была написана программа, которая показала её эффективность
Выложите программу и экселевский файл. Они либо работают, либо не работают. Это факты, и воевать ни с кем не надо будет.
Также будет неплохо, если вы напишете подробный пример вычислений со всеми шагами и таблицами. Например для числа 67591 = 257 * 263 (это произведение первых двух простых чисел, которые больше 16^2, на всякий случай). Текста для этого потребуется сильно меньше, чем вы написали в статье. Лично я сомневаюсь, что можно подобрать «числа с незначительным количеством разрядов», для разложения произведения больших простых чисел обратно на множители.
И, если мы угадали с вариантом, и рассматриваемое число не простое, использование одного из полученного числового ряда обязательно обеспечит определение целочисленных координат рассматриваемого числа.
Дак вы банально перебираете делители. Только не простые, как это обычно делают, а те, которые получаются в результате деления на простые.
Имхо, фриланс и вакансии перед последней статьей в списке как-то не к месту. Раньше дочитал статью, посмотрел вакансии. А сейчас выбираешь в новых статьях то что интересно, и тут вдруг заказы с фриланса. И после них еще одна статья и навигация по страницам. Меня в данный момент не интересует фриланс, я просто хочу что-нибудь почитать. И даже если увидел что-то интересное, все равно надо ниже до страниц прокручивать. А потом если долистал до тех статей, которые видел вчера, то вспоминаешь — о, там фриланс где-то был и вакансии, но это надо вниз крутить или назад нажимать, да ну его.
Думаю, было бы неплохо, если бы кто-то сделал сервис по типу Steam, только немного по-другому. Человек покупает право смотреть фильм, и может скачать его в любом качестве с любой озвучкой с любых торрентов. Факт покупки регистрируется в сервисе. Можно даже делать «официальные» торрент-трекеры, которые будут проверять факт покупки. Группы, делающие локализованную озвучку, могут продавать ее отдельно, как дополнение к фильму. Сейчас все это есть в каком-то виде, но распределено по разным сайтам разных производителей контента. Просто нужен сервис, который позволит это делать удобно, централизовано и относительно дешево.
Вирус содержится в документе и встраивается в процесс ворда, используя его уязвимости. Естественно, если бы каждый вирус был отдельным исполняемым файлом, все было бы гораздо проще.
А, не так понял фразу «внутрь своей папки». Думал, имеется в виду папка пользователя.
Ну ок, есть программа Word. Пользователь сохраняет абсолютно все файлы в папку Word\Documents (оставим в стороне вопрос, как быть с несколькими пользователями). Ему по почте пришел документ «Срочно отредактировать!.docx», содержащий вредоносный код. Пользователь его скачивает (в какую папку, кстати?), открывает, и вирус получает доступ на запись ко всем документам в папке Word/Documents.
Ну и в чем проблема вирусу запуститься из домашней папки пользователя, или из временной папки браузера? А потом зашифровать все в тех папках, куда есть запись.
… Этот продукт включает в себя x86-эмулятор, используемый для автоматической распаковки и мониторинга обфусцированных исполняемых файлов
… Риски безопасности можно снизить, если исследовать подозрительные файлы в изолированной безопасной среде.
Интересует вопрос. Были ли какие-то попытки объединить антивирусный движок с полноценной виртуальной машиной? Вряд ли производительность будет сильно ниже, чем со встроенным эмулятором. Зато можно не пробрасывать API в реальную систему, а также анализировать и сеть, и каждую инструкцию под текущим IP. Для постоянного мониторинга вряд ли подойдет, но для проверки по требованию было бы нормально.
Если продолжить таблицу A, то это будет заметно. Это связано с тем, что многие составные числа можно по-разному разложить на множители.
Подождем ваш пример, тогда можно будет говорить более предметно. Возможно, я где-то и ошибаюсь.
D > a^2, D = (a+c)^2
(a+c)^2 - a^2 = 2ac + c^2
Таблица разности квадратов
b^2 - a^2
для чисел от 0 до 10. Линейные зависимости хорошо заметны.Вы взяли модуль больше, при этом у вас стало больше таблиц. То, что вы стали меньше считать руками для одной конкретной таблицы, не означает, что у вас поменялся принцип. Кроме того, одно и то же число N может появляться в разных диагонялях (напр. 106). Это значит, что точного решения нет, есть множество решений. А значит и азимута нет.
Если есть такой способ, он может быть найден алгоритмически, без программ. Ну и у вас слишком запутанные объяснения. Чтобы написать программу, надо понимать каждый шаг алгоритма, который в нее надо заложить.
Ок, давайте так. Вот есть число 4123. Оно относится к первой таблице. Напишите пожалуйста все вычисления, необходимые для того, чтобы найти его координаты в таблице, ничего не сокращая и не пропуская — все формулы, ряды дискриминантов и корректирующих величин для модулей 6 и 4, и т.д. Один шаг — одно изменение.
(ax^2 + bx + c)' = 2ax + b
Разобрался не во всем, так как в описании сокращаются шаги вычислений, кое-где пропущены константы в записи уравнений (хоть они и учитываются в решении), присутствуют ссылки на то, что подробно описано ниже по тексту, и т.д.
Если коротко, то никакой сенсации нет, хотя рациональное зерно присутствует.
Все целые числа L можно представить как 6N + r. Остаток r может быть от 0 до 5 (или можно представить как от -3 до 2)
Интерес представляют только 6N + 1 и 6N + 5 (которое автор обозначает как 6N — 1), так как делимость остальных групп легко определить.
Все варианты L для группы чисел 6N + 1 можно записать в виде
(6x+1)*(6y+1)
и(6x-1)*(6y-1)
Это таблицы A и B. Например, таблица A (в ячейках находятся значения N):
Таблицы C и D для вариантов
(6x+1)(6y-1)
и(6x-1)(6y+1)
(группа 6N — 1) строятся аналогично.Если брать значения x и y больше 0, то все числа вида
L = (6x+-1)(6y+-1)
являются составными, так как получается произведение 2 чисел больше единицы. Значит, в этих 4 таблицах находятся все составные числа. Для проверки числа надо найти его номер N и проверить, есть ли он в какой-то из этих таблиц. Если нет, значит число простое.Дальше производятся всякие действия, направленные на получение информации из этого N и на связь ее с этими 4 таблицами
которые в итоге сводятся к уравнению
N = 6 * ((6k+Qmin - d-qmin)/2) * ((6k+Qmin + d+qmin)/2) + Qmin + 6k
Подставляются известные значения, остается квадратное уравнение с неизвестными d и k, d выражается через k, и дальше методом подбора ищется такое k, чтобы дискриминант был точным квадратом.
Для ускорения перебора автор добавляет расчеты по модулю 4, но по факту они особо не нужны. Этот перебор вариантов никак не ограничен, надо проверить все возможные значения, при которых дискриминант больше или равен 0.
… Обычно такие уравнения решаются путем подбора величины k
… При исследовании числа в любой из таблиц нам необходимо составить числовой ряд возможных Дискриминантов (для разных k) и, параллельно, числовой ряд точных квадратов. Общий для обоих этих рядов результат и будет искомым D.
… где k 1 – количество просчетов, необходимое для получения D, равного точному квадрату.
________
Я не знаю, зачем вы привязались к модулю 6. Все можно сделать гораздо проще.
Числа вида
(6x+-1)(6y+-1)
это просто произведение нечетных чисел, и можно использовать стандартное обозначение2n+1
.Формулы будут аналогичные, они работают одинаково для любого модуля.
Таблица в этом случае получается одна. По ней можно проверить на простоту только нечетное число, но четные проверяются тривиально.
С одной стороны все просто. Например, число 17.
L = 17 = 2*8 + 1; N = 8
. Числа 8 в таблице нет, значит число 17 простое.Но вот, например, число 2219, N = 1109. Оно есть в таблице или нет? В общем случае, даже строку, столбец, или диагональ нельзя определить. Оно может быть далеко в 1 строке, или близко в 10.
Может эту таблицу и можно как-то использовать для ускорения расчетов, но у меня не получилось найти такой способ.
Всегда есть 2 неизвестных, одну из которых надо перебирать. При расчете через арифметические прогрессии в диагоналях получилась, например, такая формула:
x0 = ((N - n) / (2*n + 1)) - n
Это никакой практической роли не играет, особенно при использовании машинных вычислений. Если у нас 20-значное число, нет большой разницы, делать ли 10^20 / 6 шагов или 10^20 / 24, все равно получается много.
Это самый непонятный момент в вашей методике. Как определяется начало диапазона?
Так вот подбор k и есть замена перебора множителей. У вас никак не ограничены ни его размер, ни число шагов для его нахождения. Чем больше исходное число, тем больше будут коэффициенты в уравнении, и тем больше надо проверить вариантов числа k.
Какая разница, воин или не воин. Вы пишете:
Выложите программу и экселевский файл. Они либо работают, либо не работают. Это факты, и воевать ни с кем не надо будет.
Также будет неплохо, если вы напишете подробный пример вычислений со всеми шагами и таблицами. Например для числа 67591 = 257 * 263 (это произведение первых двух простых чисел, которые больше 16^2, на всякий случай). Текста для этого потребуется сильно меньше, чем вы написали в статье. Лично я сомневаюсь, что можно подобрать «числа с незначительным количеством разрядов», для разложения произведения больших простых чисел обратно на множители.
Дак вы банально перебираете делители. Только не простые, как это обычно делают, а те, которые получаются в результате деления на простые.
Ну ок, есть программа Word. Пользователь сохраняет абсолютно все файлы в папку Word\Documents (оставим в стороне вопрос, как быть с несколькими пользователями). Ему по почте пришел документ «Срочно отредактировать!.docx», содержащий вредоносный код. Пользователь его скачивает (в какую папку, кстати?), открывает, и вирус получает доступ на запись ко всем документам в папке Word/Documents.
Интересует вопрос. Были ли какие-то попытки объединить антивирусный движок с полноценной виртуальной машиной? Вряд ли производительность будет сильно ниже, чем со встроенным эмулятором. Зато можно не пробрасывать API в реальную систему, а также анализировать и сеть, и каждую инструкцию под текущим IP. Для постоянного мониторинга вряд ли подойдет, но для проверки по требованию было бы нормально.