На сайте cyberforum.ru в разделе Assembler для начинающих появилось такое сообщение итак в RAX должно оказаться 0A093F75EA7D1h при умножении какого-то числа на 31337h, содержимое RDX будем игнорировать... X⋅31337h=RDX:RAX=0.0000A093F75EA7D1h X=0A093F75EA7D1/31337h=34383137h 34383137h⋅31337h=0A093F75EA7D1h X⋅31337h=RDX:RAX=1.0000A093F75EA7D1h X=1.0000A093F75EA7D1h/31337h=(18446744073709551616+176557370812369)/201527=91535727873090,771881683347640763 получается вещественное число. Нам нужно учесть при умножении вклад дробной части, поэтому сначала 1.0000A093F75EA7D1h нужно сдвинуть на 17 разрядов влево, а после деления на 31337h сдвинуть результат на 17 разрядов вправо, чтобы в RAX оказалось число 0A093F75EA7D1h Код (ASM): mov ecx,31337h mov rax,0A68051698858B34h mul rcx; edx=20001h rax=412727EEBD4FA1C42Ch add rax,10000h;целочисленное округление shrd rax,rdx,17;rax=0A093F75EA7D1h shr rdx,17;rdx=1 X⋅31337h=RDX:RAX=2.0000A093F75EA7D1h Код (ASM): mov rax,4D00E1BCCE9D1668h mul rcx add rax,10000h add edx,ecx shrd rax,rdx,17;rax=0A093F75EA7D1h shr edx,17;rdx=2 X⋅31337h=RDX:RAX=3.0000A093F75EA7D1h и т.д. то есть 34383137h не единственное число в результате умножения на которое в RAX окажется число 0A093F75EA7D1h
Странная задача и ещё более странное решение... Дискретная математика так не работает. Очевидно же: если один из множителей чётный, то и произведение будет чётным. А вы используете чётный множитель и якобы получаете нечётное произведение.
Сходу не соображу, но, имхо, направление, в котором надо копать - это взаимная простота (или ее отсуствие) чисел 0x31337, 0x34383137 и 0x10000000000000000
Dmitry_Milk, 31337h=201527=137⋅1471 0A093F75EA7D1h=176557370812369 = 19⋅137⋅1471⋅46110413 = 876097847⋅201527 34383137h= 876097847 если оперировать целыми числами, тогда 34383137h⋅31337h=0A093F75EA7D1h это единственное решение, но я же его обошел
Dmitry_Milk, я использую mul, плюс сдвиги влево вправо, не оговаривалось использование imul с двумя операндами, тогда содержимое rdx бы не менялось примерно, так же реализуется деление через умножение
В общем, если задача формулируется исключительно для целочисленного/fixedpoint представления чисел, то математически она сводится к модульной арифметике по модулю 264. Надо найти наибольший общий делитель фиксированного множителя и модуля и проверить целочисленную делимость заданного произведения на этот НОД. При делимости этот НОД и будет количеством возможных ответов. В данной задаче НОД от 0x31337 и 264 равен единице, и поскольку произведение уже проверено на делимость предложенным вторым множителем - то этот второй множитель и является единственным решением задачи. Хотя не, я не учел представление отрицательных чисел в доп.коде (а тут imul, а не mul). Как соотносятся допкодовые представления 128-битного произведения с модульной арифметикой я сходу не соображу
я рассуждал так ― мне в результате умножения 31337h на Х нужно получить число 1.0000A093F75EA7D1h поэтому Код (ASM): ; ищу значение Х mov ecx,31337h mov edx,1 mov rax,0A093F75EA7D1h div rcx; rax=5340528B4C42h mov rbx,rax ; проверяю правильность вычисления X mul rcx; 5340528B4C42h⋅31337h=1.0000A093F75C482Eh маловато будет inc rbx ; добавим единицу mov rax,rbx mul rcx; 5340528B4C43h⋅31337h=1.0000A093F75F5B65h а теперь перебор но 0A093F75C482Eh≠0A093F75EA7D1h≠0A093F75F5B65h почему? А потому, что X=1.0000A093F75EA7D1h/31337h=18446920631080363985/201527=91535727873090,771881683347640763
Код (ASM): mov rax,0x31337 // это число константа, никогда не изменяется mov rcx,0x34383137 // Здесь может быть любое число 8 байт. imul rax,rcx // здесь получаем 0xA093F75EA7D1. (умещается в 8 байт) Арифметически - положительному произведению 0A093F75EA7D1h при известном положительном множителе 31337h всегда будет соответствовать единственный сомножитель 3438 3137h. Примем как преюдицию. Тогда предмет доказывания - это переполнение и аномалии инструкции imul. Проверим. Начнём с граничного значения. Возьмём наибольший положительный сомножитель: 31337h * 7FFF FFFF FFFF FFFFh = rdx:0 rax: 7FFF FFFF FFFC ECC9h Переполнения не возникает?! Двухоперандная форма imul не трогает rdx. Двухоперандная форма не обрабатывает переполнение! Значит, надо искать здесь --- Сообщение объединено, 21 окт 2026 в 17:02 --- Я уже подбираюсь к ответу. mov rcx,034700000h даёт rax = A13f 9410 0000h --- Сообщение объединено, 21 окт 2026 в 17:04 --- mov rcx,034500000h даёт rax = A0DD 2D30 0000h --- Сообщение объединено, 21 окт 2026 в 17:07 --- ...и я вернулся к исходному значению --- Сообщение объединено, 21 окт 2026 в 17:21 --- --- Сообщение объединено, 21 окт 2026 в 17:49 --- Последнее положительное значение до переполнения rcx=29A00F298D85h даёт rax=7FFF FFFF FFFD 4693h Двухоперандная форма imul спокойно забивает на знак и идёт дальше: rcx=29A00F298D86h даёт rax=8000 0000 0000 59CAh
Ваши три числа разные потому, что (2⁶⁴+TARGET) не делится нацело на 0x31337 (частное 91535727873090,77...), и целое X «перескакивает» TARGET — точного X для k=1 не существует. Число из темы получается не из этого деления, а из другого уравнения, учитывающего add rax, 10000h (стандартное округление при сдвиге на 17 бит) и shrd rax, rdx, 17. Именно эта последовательность, а не «подбор остатка», позволяет попасть в TARGET. Если вы имеете в виду именно imul rax, rcx из вашей программы — других чисел НЕТ. 0x34383137 — единственное 64-битное значение. А «другие числа» из темы cyberforum получаются только потому, что там используется другой алгоритм (с mul, add rax,10000h, shrd), где младшие 64 бита RAX зависят ещё и от старших 64 бит произведения. Инструкция / алгоритмДругие X?imul rax, rcx (2 операнда)❌ Нет — единственное 0x34383137mul rcx (1 операнд, 128-бит)✅ Да — для каждого k с целым делениемmul + add rax,10000h + shrd/shr (алгоритм темы)✅ Да — для k=0,1 (и k≥2 с add edx,ecx)
А знаете что? А я не поленился и проверил все граничные условия инструкции imul и вот что получил: Спойлер: Проверки Условие задачи: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,34383137h imul rax,rcx mov hiProduct,rdx mov loProduct,rax ;rdx=0 mov rax,rdx Spell64rax 0, szCaption, szRDX ;rax=0A093 F75E A7D1h mov rax,loProduct Spell64rax 0, szCaption, szRAX Граничное условие 0 - максимальный положительный множитель: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,7FFFFFFFFFFFFFFFh imul rax,rcx mov hiProduct,rdx mov loProduct,rax ;rdx=0 mov rax,rdx Spell64rax 0, szCaption, szRDX ;rax=7FFF FFFF FFFC ECC9h mov rax,loProduct Spell64rax 0, szCaption, szRAX Граничное условие 1 - максимальный беззнаковый множитель: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,0FFFFFFFFFFFFFFFFh imul rax,rcx mov hiProduct,rdx mov loProduct,rax ;rdx=0 mov rax,rdx Spell64rax 0, szCaption, szRDX ;rax=0FFFF FFFF FFFC ECC9h mov rax,loProduct Spell64rax 0, szCaption, szRAX Граничное условие 2 - до переполнения сомножителя: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,29A00F298D85h imul rax,rcx ;rax=7FFF FFFF FFFD 4693h Spell64rax 0, szCaption, szRAX Граничное условие 3 - после переполнения сомножителя: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,29A00F298D86h imul rax,rcx ;rax=8000 0000 0000 59CAh Spell64rax 0, szCaption, szRAX Граничное условие 4 - до переполнения произведения: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,53401E531B0Bh imul rax,rcx ;rax=0FFFF FFFF FFFD A05Dh Spell64rax 0, szCaption, szRAX Граничное условие 5 - после переполнения произведения: Код (ASM): xor rdx,rdx mov rax,31337h mov rcx,53401E531B0Ch imul rax,rcx ;rax=0000 0000 0000 B394h Spell64rax 0, szCaption, szRAX Видим, что после переполнения произведения (rcx=53401E531B0Bh) результат rax обнуляется. Поэтому предварительный ответ (пока до конечного ответа я не добрался): возможно, числу 31337h повезёт, но в целом такая практика очень fragile, поэтому не рекомендуется к применению --- Сообщение объединено, 21 окт 2026 в 18:57 --- А в свете сказанного рассмотрим подтекст на сайте cyberforum.ru: 1) некто пишет в паблик реквест с вопросом, который больше говорит о лени и ЧСВ, чем об интересе. 2) число 31337h - это eleet на leet-спике, т.е. его троллит "илитарий"; 3) к вопросу подключаются очень мощные люди; 4) господин под ником UnknownSoldier пишет ответ, что "единственное решение 0x0000000034383137", основываясь на абстрактной математике, а не на работе процессора; 5) господин под ником NoNaMe (вот это wow, потому что коллаба NoNaMe известна всем, кто хоть раз устанавливал AutoCAD с диска, купленного на книжном рынке) это подтверждает; 6) ТС пишет в метке (хотя и с ошибкой) и дублирует в сообщении упоминание на некого сайта crackme.one. ??? что с этим миром не так? --- Сообщение объединено, 21 окт 2026 в 19:10 --- ...И ответ: таки да! Числу 31337h повезло: rcx=5340 1E53 1B0Ch rax=B394 где-то здесь 31337h rcx=5340 1E53 1B0Dh rax=3 C6CBh Поэтому формально авторитеты правы: при любом другом числе, которое содержит rcx (264―1), мы в rax никогда не получим 0xA093F75EA7D1 - доказано. Но это частный случай, а в общем случае утверждение неверно
/offtopic Cyberforum чмошный форум, где мудерация сообщений доведена до абсурда. Там толком нельзя ничего писать. Можете так и передать мудераторам - чмошный форум, прокачанный на платное решение задач ЕГЭшников.
Опять я поторопился. Мой вывод правильный: Ход мысли тоже верный: повтор через переполнение для множителя 31337h не попадает в первоначальное значение. Но итоговое обоснование требует утонения: rcx=5340 1E53 1B0Bh + 3438 3137h = 5340 528B 4C42h rax=A093 F75C 482Eh где-то здесь A093 F75E A7D1h rcx=5340 1E53 1B0Bh + 3438 3137h = 5340 528B 4C42h rax=A093 F75F 5B65h Поэтому формально авторитеты cyberforum.ru правы: при любом другом числе, которое содержит rcx (264―1), мы в rax никогда не получим 0xA093F75EA7D1 - доказано. Но это частный случай, а в общем случае их утверждение неверно. Их математическое обоснование без учёта работы процессора неверно в любом случае. Добавил логгер, чтобы цикличность была наглядной.