Я работаю над некоторым кодом Matlab для выполнения так называемой атаки индексного исчисления на данную криптосистему (это включает в себя вычисление дискретных значений журнала), и я все это сделал, за исключением одной маленькой вещи. Я не могу понять (в Matlab), как решить линейную систему сравнений по модулю p, где p не простое число. Кроме того, в этой системе более одной переменной, поэтому, если я что-то не упустил, китайская теорема об остатках не сработает.
Я задал вопрос о математическом стеке с более подробным/отформатированным mathjax здесь. Я решил проблему в своем вопросе по этой ссылке, и теперь я пытаюсь найти утилиту, которая позволит мне решить систему сравнений по модулю не простого числа. Я нашел пакет, который включает решатель, поддерживающий модульную арифметику, но модуль должен быть простым (здесь). Я также попытался изменить его для работы с непростыми числами, но какой бы метод ни использовался, он не работает, потому что он требует, чтобы все элементы системы имели инверсию по модулю p.
Я изучил возможность использования в Matlab возможности вызова функций MuPAD, но из моего тестирования функция MuPAD linsolve
(которая казалась лучшим кандидатом) также не поддерживает непростые значения модуля. Кроме того, я проверил с помощью Maple, что эта система разрешима по модулю интересующего меня целого числа (8), поэтому это можно сделать.
Чтобы быть более конкретным, это точная команда, которую я пытаюсь запустить в MuPAD:
linsolve([0*x + 5*y + 4*z + q = 2946321, x + 7*y + 2*q = 5851213, 8*x + y + 2*q = 2563617, 10*x + 5*y + z = 10670279],[x,y,z,q], Domain = Dom::IntegerMod(8))
Error: expecting 'Domain=R', where R is a domain of category 'Cat::Field' [linsolve]
Та же команда возвращает правильные значения, если я изменяю домен на IntegerMod(23) и IntegerMod(59407), поэтому я считаю, что 8 не подходит, потому что это не простое число. Вот результат, когда я пытаюсь выполнить приведенную выше команду с каждым 23 и 59407 в качестве моего домена:
[x = 1 mod 23, y = 1 mod 23, z = 12 mod 23, q = 14 mod 23]
[x = 14087 mod 59407, y = 1 mod 59407, z = 14365 mod 59407, q = 37320 mod 59407]
Эти ответы верны: x
, y
, z
и q
соответствуют L1
, L2
, L3
и L4
в системе сравнений, расположенной по моей ссылке Math.StackExchange выше.
linsolve
неработающей (и даже какую из трехlinsolve
функций вы имеете в виду). Вы ожидаете более одного решения, но решатели вернуть только один? Есть ли какой-нибудь код C, который это реализует? – возможно, вы сможете создать функцию mex. - person horchler   schedule 02.12.2013nlinfit
)? - person Landak   schedule 02.12.2013bintprog
может быть лучшим вариантом. - person horchler   schedule 02.12.2013