Ru-Board.club
← Вернуться в раздел «Программы»

» Mathematica (математика)

Автор: popkov
Дата сообщения: 20.05.2010 10:44
Someek
Ошибка в том, что ты после o != 1 поставил точку с запятой вместо запятой. Поэтому условие продолжения цикла всегда не выполнено, т.к. тело цикла и оказывается условием. Вот правильный вариант:

[no]d := 1
c := 8
t := 0
e := 0
A := 67
o := -3
While[o != 1, {m = Select[Range[100], Mod[(d # + c), o] == 0 &],
If[o < 0, o = -o], t = c, c = (t*m[[1]] + A*d)/o, e = d,
d = (e*m[[1]] + t)/o, o = c^2 - A*d^2, Print["x=", d],
Print["y=", c]}][/no]
Автор: Someek
Дата сообщения: 20.05.2010 19:53
Спасибо огромное) вы очень мне помогли,а то я неделю сидел и не мог понять в чем дело)

Добавлено:
а подскажите, у Mathematica есть какой-то предел в вычислениях?...
просто возникла еще проблемка... когда "х" получается 9-ти значным числом, то все норм, но когда "х" должно быть 10-ти значным или более вылезает ошибка:

Part::partw: "Part 1 of {} does not exist. More…

Вот весь мой код.
При "A" равном 109 или 149 значение "х" становится 10-ти и более значным числом.
Возможно происходит какое-то переполнение...
Можно ли устранить это?

y := 0
A := 149
While[y^2 - A < 1, y += 1;]

b := y^2 - A

k := (y - 1)^2 - A

e := b - 1
i := 1 - k

If[e > i, z := y - 1]
If[e > i, o := k]
If[e < i, z := y]
If[e < i, o := b]
d := 1
c := z
t := 0
e := 0

While[o != 1, {m = Select[Range[100], Mod[( d # + c), o] == 0 &], If[
o < 0, o = -o], t = c, c = (t*m[[1]] + A*d)/o, e = d, d = (e*m[[1]] + t)/o,
o = c^2 - A*d^2 }]
Print["x=", d]
Print["y=", c]
Автор: popkov
Дата сообщения: 21.05.2010 06:44
Someek
В таких случаях удобо вставлять в код команду Print[], чтобы выяснить значение переменной в момент, когда происходит ошибка. Вот модифицированный фрагмент кода:
[no]While[o != 1, {m = Select[Range[100], Mod[(d # + c), o] == 0 &];
Print[m], If[o < 0, o = -o], t = c, c = (t*m[[1]] + A*d)/o, e = d,
d = (e*m[[1]] + t)/o, o = c^2 - A*d^2}][/no]
Выполнение приводит к печати всех значений, принимаемых m, и мы видим, что ошибка возникает тогда, когда значение равно пустому списку {}: у пустого списка нет первого элемента. Почему так получается - разбираться тебе.
Автор: Someek
Дата сообщения: 21.05.2010 06:51
Спасибо, буду разбираться)
Автор: Baset
Дата сообщения: 26.05.2010 10:05
Вы не могли бы помочь с алгоритмом RC4? не могу найти, как точно поменять строчки и столбцы местами...(
Автор: popkov
Дата сообщения: 26.05.2010 12:32
Baset

Цитата:
как точно поменять строчки и столбцы местами...(

Transpose[]
Автор: Baset
Дата сообщения: 26.05.2010 19:07
там задание провести инициализацию массива s по инструкциям алгоритма RC4.
Используемые функции: Mod[j+s[[i]]+kx0,256,1].
тогда как?
Автор: popkov
Дата сообщения: 26.05.2010 21:59
Baset
Тут уж тебе лучше знать. При чем тут Mathematica? В ней нет понятия инициализации (или оно не требуется). Алгоритм RC4 мне не известен.
Автор: KChernov
Дата сообщения: 27.05.2010 12:52
А в субже уже исправили интегрирование?
или достаточно полученный интеграл продиффиоренцировать тем же субжем и, если получится исходное выражение, - значит всё хорошо?

И как полученный неопределённый интеграл/первообразную сразу получить как функцию? Если делаю F[x_]:=Integrate[f[x], x] - пишет, что $Failed и Protected.
Как правильно?
Автор: popkov
Дата сообщения: 27.05.2010 15:37
KChernov

Цитата:
как полученный неопределённый интеграл/первообразную сразу получить как функцию?

Удобнее использовать NIntegrate, если тебе нужна числовая функция.
Цитата:
Если делаю F[x_]:=Integrate[f[x], x] - пишет, что $Failed и Protected.
Как правильно?
Не совсем понимаю, зачем потребовался неопределенный интеграл как функция. В твоей записи неверно использование переменной интегрирования в качестве параметра функции. По хорошему, правильно так:

In[10]:= F := Integrate[Sin[x], x]
F /. x -> 1

Out[11]= -Cos[1]


Цитата:
А в субже уже исправили интегрирование?

"Исправили" так же, как и раньше: голову вытащили - хвост увяз... В общем, надо проверять все в разных версиях системы, а также численными методами.
Автор: Baset
Дата сообщения: 27.05.2010 17:10
а как можно задать массив с индексами?
Автор: KChernov
Дата сообщения: 27.05.2010 17:25
popkov
На самом деле мне нужна первообразная.
Мне надо численно посчитать интеграл от произведения этой функции на кусочно-постоянную (пишу это на фортране, а субжем брал интеграл).

Спасибо, попробую.


Цитата:
В общем, надо проверять все в разных версиях системы, а также численными методами.

То есть просто проделать обратную операцию и сравнить с оригиналом недостаточно?

Добавлено:
Baset
Справка по слову array.
Автор: popkov
Дата сообщения: 27.05.2010 17:26
Baset
В Mathematica массивы называются списками (List). Любой элемент списка можно получить функцией Part, если знать его индекс. Остальное легко найдешь в справке. Неужели так лень почитать, это ведь не документация к MatLab и не язык С++!

Добавлено:
KChernov

Цитата:
То есть просто проделать обратную операцию и сравнить с оригиналом недостаточно?

В общем случае ты при дифференцировании можешь получить совершенно другую форму записи функции, которую Mathematica даже может оказаться неспособна (без неслабой помощи с твоей стороны) символьно свести к той, которая была первоначально. Обычно первым делом стоит сравнить результат Integrate и NIntegrate (это совсем просто: добавление одной буквы). А вообще, без проверки вручную в случае интегрирования обойтись вряд ли возможно: Mathematica - лишь подсказчик в таких случаях. Никто не может гарантировать, что она не облажалась и, кроме того, она выдает всегда "общее" решение без учета особых точек интегрируемой функции (она их почти неспособна учитывать). Поэтому без проверки ручками обойтись вряд ли получится.
Автор: Baset
Дата сообщения: 27.05.2010 20:39
да не сложно. а сложно решить такую задачу:
провести инициализацию массива s по инструкциям алгоритма RC4.
Используемые функции: Mod[j+s[[i]]+kx0[[i]],256,1] - в этой модификации функции определения вычета диапазон получаемых значений лежит в пределах от 1 до 256, что совпадает с диапазоном индексов, используемых при адресации элементов списков.
p.s. как я поняла, там должно быть (теоретически) что-то вроде этого:

Начальное заполнение массива:
for i = 0 to 2n &#8722; 1
S[i] = i

Скремблирование:
j = 0
for i = 0 to 2n &#8722; 1
j = (j + S[i] + Key[i mod l]) mod 2n
Перестановка (S[i], S[j])

только в Mathematica

Добавлено:
ток вместо этой ... что он выдаёт (&#8722;) минус один
Автор: popkov
Дата сообщения: 27.05.2010 23:09
Baset

Цитата:
только в Mathematica

Господи, ну что за бред! Ты пишешь некий процедуральный код. Mathematica - среда программирования в первую очередь функционально-ориентированная. Процедурные конструкции в Mathematica неэффективны и неудобны, хотя и реализуемы очень просто. В общем, справка в помощь.

Добавлено:
Baset
Я мог бы легко оптимизировать твой код, если бы понимал его смысл. И без неологизмов типа "скремблирование" и т.п. Здесь не перед кем кидаться "умными" терминами. Если пишешь пример - не путай разные синтаксисы. Откуда мне знать, что значит функция "Key"? Для начала ознакомься с документацией или же пиши стандартным математическим языком и проверяй то, что здесь оказывается опубликовано. Твой последний пост снова содержит бессмысленные символы. Его можно было бы отредактировать, нажав ссылку "Редактировать" вверху слева самого твоего поста. Хоть немного надо же делать самой. А не лениться до патологии!



Добавлено:
Baset

Цитата:
а сложно решить такую задачу:
провести инициализацию массива s по инструкциям алгоритма RC4.

Боюсь, в Mathematica ты потерпишь неудачу или же тебе придется реализовывать этот алгоритм самой вручную, на низком уровне. Я ничего об этом алгоритме не знаю, так что или объясняй просто или ищи решение сама. В любом случае, эта затея противоречит идеологии Mathematica, т.к. разработчики этой системы стремились вложить наиболее эффективные алгоритмы во встроенные в систему функции, избавляя пользователя от необходимости их реализации вручную. Попытка реализации встроенных алгоритмов вручную неизбежно приводит к замедлению кода на порядки. Результат будет тот же, но гораздо более дорогой ценой...
Автор: Baset
Дата сообщения: 28.05.2010 08:52
задачу и термины в ней придумывала не я, так что не стоит ругаться..я от этой задачи сама давно в шоке и не понимаю, как с ней и что. потому с вами и общаюсь..
не можете решить - так и скажите. не стоит валить на то, что я не умею выражаться "по-правильному", неотредактированные сообщения и общую некошерность.
я ведь только учусь, а не вступаю с вами в пространные дебаты на уровне продвинутого пользователя.
в любом случае, спасибо за внимание.

Добавлено:
Вот теория по этой теме:


В алгоритме RC4 используется S – блок : S0, S1, … S255. Элементы представляют собой перестановку чисел от 0 до 255, а перестановка зависит от ключа переменной длины.
В алгоритме применяются два счетчика i и j с нулевыми начальными значениями.
Чтобы сгенерировать случайный байт, выполните следующие операции:
i = (i + 1) mod 256;
j = (j + Si) mod 256;
Поменяйте местами Si и Sj;
t = (Si + Sj) mod 256;
K = St

Байт К используется в операции XOR с открытым текстом для получения шифртекста или в операции XOR с шифртекстом для получения открытого текста.
Инициализация S-блока проводится следующим образом.
Сначала заполним его линейно: S0=0, S1=1, … S255=255.
Затем заполним ключом другой 256 – байтовый массив. Если необходимо, повторяем ключ, чтобы заполнить весь массив:
K0, K1, … K255.
Установим значение индекса j равным 0.
Затем:
Для i от 0 до 255
    j = ( j + Si + Ki) mod 256
    Поменяйте местами Si и Sj;
Автор: popkov
Дата сообщения: 28.05.2010 11:10
Baset
Хм... хоть становится ясно, что это алгоритм шифрования, причем простой. Однако твое описание неясное какое-то. Это не изложение алгоритма, а только какие-то фрагменты описания, составленного любителем. Поэтому "алгоритм" похож на головоломку...

Добавлено:
Ну да ладно, переведу то, что есть.

Вот "S-блок", заполненный линейно цифрами от 0 до 255:
Код: S = Range[0, 255]
Автор: KChernov
Дата сообщения: 28.05.2010 13:25
popkov
В общем попробовал я брать производную от того интеграла - даже сама математика её обратно не берёт (то есть другая функция получается)
А ещё почему-то она параметризованную функцию тоже интегрировать не хочет (числа подставляешь - интегрирует, но не в общем виде).
В общем как-то всё грустно.

А ещё решил пересчитать одну вещь, где картинка импортируется в градациях серого, так теперь не работает ни в 5.2, ни в 7 (делал я её вроде в 6-ке) - импортирует какую-то хрень - буду разбираться.

Спасибо за советы
Автор: Baset
Дата сообщения: 28.05.2010 16:36
popkov
спасибо, уже решила по-другому немного:

i=Range[1,256]
j=Range[1,256]
s0=Range[1,255]
kx0=IntegerPart[255,256]
i=0
j=0
s=s0
Do[j=Mod[j+s[[i+1]]+kx0[[i+1]],256];g=s[[i+1]];s[[i+1]]=s[[j+1]];s[[j+1]]=g,{i,0,255}];
s

работает) хотя и не то, что препод хотел, но ответ-то тот же))

Цитата:
Кстати, а почему ты все это хочешь реализовать именно в Mathematica? Ведь инструкция написана для реализации на C.


да потому что в моём несуразном инсте криптографию почему-то в Математике реализуют..
на С я и сама знала как делать, а вот как это переиначить в Математике...хз)
Автор: popkov
Дата сообщения: 28.05.2010 17:23
KChernov

Цитата:
В общем как-то всё грустно.

Думаю, с интегрированием будет грустно еще долго: интегрирование - искусство. Универсальные алгоритмы существуют лишь для считанных частных случаев, да и тогда не всегда дают оптимальный результат (но хотя бы дают гарантированно верный результат). Я читал у одного блоггера (к сожалению, его блог удален сейчас), что наилучшая реализация алгоритмов интегрирования была в системе Reduce. А наиболее математически корректная система, как говорит В.Бондаренко - Derive. Mathematica - самая универсальная и крутая, но не самая математически корректная.

Baset

Цитата:
в моём несуразном инсте криптографию почему-то в Математике реализуют..

Ну что ж, твой институт хорош хотя бы тем, что там знакомят с Mathematica. А криптографию я вообще надувательством считаю...
Автор: Baset
Дата сообщения: 28.05.2010 21:22
а вы во всём умные?)
если я вам ещё страшненьких и странненьких задач подкину на решение, ничего?
причём, самое смешное, что реализовать их надо будет с помощью простого калькулятора, но там шифры Цезаря, РСЛОС и т.д.
Автор: KChernov
Дата сообщения: 28.05.2010 21:31
Казалось бы такая простая вещь, но как в субже увеличить размер шрифтов по-умолчанию? А то всё какое-то мелкое. Если выделить - поменять можно, но очередное вычисление - и результат опять мелкий.
Автор: Griefin
Дата сообщения: 28.05.2010 22:25
KChernov
Текст выглядит мелко, т.к. Mathematica по умолчанию настроена на маковское значение screen dpi, которое равно 72. Чтобы увеличить размер шрифта, нужно открыть Option Inspector, выбрать Global Preferences, присвоить параметру Global Options/System Configuration/ScreenResolution значение 96. Далее, найти Formatting Options/Font Options/FontProperties/ScreenResolution установить в Automatic. После перезапуска шрифты должны стать больше.

Кроме того, там в строке статуса у окон есть масштабный коэффициент для размера шрифтов.
Автор: KChernov
Дата сообщения: 29.05.2010 09:02
Griefin

Цитата:
Global Options/System Configuration/ScreenResolution

Тут у меня 0

Цитата:
Formatting Options/Font Options/FontProperties/ScreenResolution

А тут - 72
Но всё это серое и поменять не получается.
Версия 7.0.1.


Цитата:
Кроме того, там в строке статуса у окон есть масштабный коэффициент для размера шрифтов.

А вот этого думаю за глаза хватит, тем более, что эта настройка сохраняется в файле.

Спасибо за помощь
Автор: Griefin
Дата сообщения: 29.05.2010 23:09
KChernov
Я выше писал, что нужно в этом окне выбрать пункт Global Preferences. Иначе действительно настройки будут заблокированы.
Автор: KChernov
Дата сообщения: 30.05.2010 07:35
Griefin
Действительно пропустил этот момент. Всё настроил, спасибо
Автор: terminat0r
Дата сообщения: 04.06.2010 19:30
Уважаемые знатоки Mathematica.
Есть у меня функция нескольких переменных, возвращает фазу в границах +-Pi /2
Нашел вот такую функцию, которая исправляет фазу, т.е. делает гладкую кривую без границ +-Pi /2

Код:
UnwrapPhase1[data_?VectorQ, tol_: Pi, inc_: 2 Pi] :=
FixedPoint[# +
inc*FoldList[Plus, 0.,
Sign[Chop[ListCorrelate[{1, -1}, #],
tol] (*close Chop*)] (*close Sign*)] &,(*close FoldList*)
data] (*close FixedPoint and overall function*)
Автор: popkov
Дата сообщения: 04.06.2010 21:30

Цитата:
Вопрос такой, можно ли это все организовать в Mathematica в одну функцию/процедуру
Можно-то можно, только вот так уж ли много в этом смысла? В чем смысл "исправления фазы", - если ты все равно потом интерполируешь? Не проще ли интерполировать сразу?
Автор: terminat0r
Дата сообщения: 07.06.2010 19:51
popkov

Цитата:
В чем смысл "исправления фазы"

Смысл есть и очень большой. Сравните как пример
https://ccrma.stanford.edu/~jos/filters/img895.png
https://ccrma.stanford.edu/~jos/filters/img896.png
Вы сможете интерполировать с пом. сплайнов кривую на первом рисунке?

Автор: popkov
Дата сообщения: 08.06.2010 10:29

Цитата:

Вы сможете интерполировать с пом. сплайнов кривую на первом рисунке?

Вообще-то интерполируют набор точек, а не кривую. По этой причине даже разрывную и ломаную функцию можно интерполировать теми же сплайнами (если нет дублирующихся точек). Вот, например, интерполяция тангенса сплайнами:
[no]
fun = Tan[(x - 1/2) Pi];
pl = Plot[fun, {x, -2, 2}]
points = Join @@ Cases[pl, x_Line, Infinity][[All, 1]];
ListPlot[points]
int = Interpolation[points, Method -> "Spline"];
Plot[int[x], {x, -2, 2}][/no]

Страницы: 12345678910111213141516171819202122232425262728293031323334

Предыдущая тема: Идея несуществующей программы...


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.