Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Программы » Wolfram Mathematica | Математика

Модерирует : gyra, Maz

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Открыть новую тему     Написать ответ в эту тему

xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Wolfram Mathematica 14

Загрузка и поиск "лекарств"в "Варезнике"


 
Здесь обсуждаем вопросы языка Mathematica и программы, которая ИМХО лучше других выполняет свою задачу и, кроме, того очень точно соответствует своему названию, хотя там не забыли и про физиков и химиков и всех остальных:)

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 16:00 01-12-2003 | Исправлено: zAlAn711, 18:21 10-01-2024
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Someek
Ошибка в том, что ты после o != 1 поставил точку с запятой вместо запятой. Поэтому условие продолжения цикла всегда не выполнено, т.к. тело цикла и оказывается условием. Вот правильный вариант:
 
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]}]

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 11:44 20-05-2010
Someek

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо огромное) вы очень мне помогли,а то я неделю сидел и не мог понять в чем дело)
 
Добавлено:
а подскажите, у 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]

Всего записей: 4 | Зарегистр. 19-05-2010 | Отправлено: 20:53 20-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Someek
В таких случаях удобо вставлять в код команду Print[], чтобы выяснить значение переменной в момент, когда происходит ошибка. Вот модифицированный фрагмент кода:
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}]
Выполнение приводит к печати всех значений, принимаемых m, и мы видим, что ошибка возникает тогда, когда значение равно пустому списку {}: у пустого списка нет первого элемента. Почему так получается - разбираться тебе.

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 07:44 21-05-2010
Someek

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, буду разбираться)

Всего записей: 4 | Зарегистр. 19-05-2010 | Отправлено: 07:51 21-05-2010
Baset

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вы не могли бы помочь с алгоритмом RC4? не могу найти, как точно поменять строчки и столбцы местами...(

Всего записей: 7 | Зарегистр. 26-05-2010 | Отправлено: 11:05 26-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Baset

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

Transpose[]

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 13:32 26-05-2010
Baset

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
там задание провести инициализацию массива s по инструкциям алгоритма RC4.  
Используемые функции: Mod[j+s[[i]]+kx0,256,1].
тогда как?

Всего записей: 7 | Зарегистр. 26-05-2010 | Отправлено: 20:07 26-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Baset
Тут уж тебе лучше знать. При чем тут Mathematica? В ней нет понятия инициализации (или оно не требуется). Алгоритм RC4 мне не известен.

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 22:59 26-05-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А в субже уже исправили интегрирование?
или достаточно полученный интеграл продиффиоренцировать тем же субжем и, если получится исходное выражение, - значит всё хорошо?
 
И как полученный неопределённый интеграл/первообразную сразу получить как функцию? Если делаю F[x_]:=Integrate[f[x], x] - пишет, что $Failed и Protected.
Как правильно?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 13:52 27-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KChernov

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

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

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

"Исправили" так же, как и раньше: голову вытащили - хвост увяз... В общем, надо проверять все в разных версиях системы, а также численными методами.

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 16:37 27-05-2010
Baset

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а как можно задать массив с индексами?

Всего записей: 7 | Зарегистр. 26-05-2010 | Отправлено: 18:10 27-05-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
На самом деле мне нужна первообразная.
Мне надо численно посчитать интеграл от произведения этой функции на кусочно-постоянную (пишу это на фортране, а субжем брал интеграл).
 
Спасибо, попробую.  
 

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

То есть просто проделать обратную операцию и сравнить с оригиналом недостаточно?
 
Добавлено:
Baset
Справка по слову array.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 18:25 27-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Baset
В Mathematica массивы называются списками (List). Любой элемент списка можно получить функцией Part, если знать его индекс. Остальное легко найдешь в справке. Неужели так лень почитать, это ведь не документация к MatLab и не язык С++!
 
Добавлено:
KChernov

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

В общем случае ты при дифференцировании можешь получить совершенно другую форму записи функции, которую Mathematica даже может оказаться неспособна (без неслабой помощи с твоей стороны) символьно свести к той, которая была первоначально. Обычно первым делом стоит сравнить результат Integrate и NIntegrate (это совсем просто: добавление одной буквы). А вообще, без проверки вручную в случае интегрирования обойтись вряд ли возможно: Mathematica - лишь подсказчик в таких случаях. Никто не может гарантировать, что она не облажалась и, кроме того, она выдает всегда "общее" решение без учета особых точек интегрируемой функции (она их почти неспособна учитывать). Поэтому без проверки ручками обойтись вряд ли получится.

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 18:26 27-05-2010 | Исправлено: popkov, 09:12 03-08-2013
Baset

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да не сложно. а сложно решить такую задачу:
провести инициализацию массива 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;)  минус один

Всего записей: 7 | Зарегистр. 26-05-2010 | Отправлено: 21:39 27-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Baset

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

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

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

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

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 00:09 28-05-2010
Baset

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
задачу и термины в ней придумывала не я, так что не стоит ругаться..я от этой задачи сама давно в шоке и не понимаю, как с ней и что. потому с вами и общаюсь..
не можете решить - так и скажите. не стоит валить на то, что я не умею выражаться "по-правильному", неотредактированные сообщения и общую некошерность.
я ведь только учусь, а не вступаю с вами в пространные дебаты на уровне продвинутого пользователя.
в любом случае, спасибо за внимание.
 
Добавлено:
Вот теория по этой теме:
 
 
В алгоритме  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;

Всего записей: 7 | Зарегистр. 26-05-2010 | Отправлено: 09:52 28-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Baset
Хм... хоть становится ясно, что это алгоритм шифрования, причем простой. Однако твое описание неясное какое-то. Это не изложение алгоритма, а только какие-то фрагменты описания, составленного любителем. Поэтому "алгоритм" похож на головоломку...
 
Добавлено:
Ну да ладно, переведу то, что есть.
 
Вот "S-блок", заполненный линейно цифрами от 0 до 255:
Код:
S = Range[0, 255]

Вот произвольный ключ:
Код:
key="parol";

Теперь заполняем паролем другой массив из 256 символов:
Код:
key = "parol";
ch = ToCharacterCode[key]
nn = Quotient[256, Length[ch]] + 1
KK=Take[Flatten@Table[ch, {nn}], 256]

KK - это и есть нужный массив.
 
Теперь "Установим значение индекса j равным 0. Затем: Для i от 0 до 255
    j = ( j + Si + Ki) mod 256
    Поменяйте местами Si и Sj; " будет записываться так:
Код:
j=0;
For[i = 1, i <= 256, i++, j = Mod[j + S[[i]] + KK[[i]], 256];  
 jj = j + 1; temp = S[[i]]; S[[i]] = S[[jj]]; S[[jj]] = temp;]

Что касается первого абзаца, его назначение я не понял. Кстати, а почему ты все это хочешь реализовать именно в Mathematica? Ведь инструкция написана для реализации на C.
 
Вот рабочий код целиком:
Код:
S = Range[0, 255];
key = "parol";
ch = ToCharacterCode[key]
nn = Quotient[256, Length[ch]] + 1;
KK = Take[Flatten@Table[ch, {nn}], 256];
j = 0;
For[i = 1, i <= 256, i++, j = Mod[j + S[[i]] + KK[[i]], 256];  
  jj = j + 1; temp = S[[i]]; S[[i]] = S[[jj]]; S[[jj]] = temp;];
S

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 12:10 28-05-2010 | Исправлено: popkov, 13:01 28-05-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
popkov
В общем попробовал я брать производную от того интеграла - даже сама математика её обратно не берёт (то есть другая функция получается)
А ещё почему-то она параметризованную функцию тоже интегрировать не хочет (числа подставляешь - интегрирует, но не в общем виде).
В общем как-то всё грустно.
 
А ещё решил пересчитать одну вещь, где картинка импортируется в градациях серого, так теперь не работает ни в 5.2, ни в 7 (делал я её вроде в 6-ке) - импортирует какую-то хрень - буду разбираться.
 
Спасибо за советы

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 14:25 28-05-2010
Baset

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
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.  

 
да потому что в моём несуразном инсте криптографию почему-то в Математике реализуют..
на С я и сама знала как делать, а вот как это переиначить в Математике...хз)

Всего записей: 7 | Зарегистр. 26-05-2010 | Отправлено: 17:36 28-05-2010 | Исправлено: Baset, 17:37 28-05-2010
popkov

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
KChernov

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

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

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

Ну что ж, твой институт хорош хотя бы тем, что там знакомят с Mathematica. А криптографию я вообще надувательством считаю...

Всего записей: 1835 | Зарегистр. 22-03-2003 | Отправлено: 18:23 28-05-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Компьютерный форум Ru.Board » Компьютеры » Программы » Wolfram Mathematica | Математика


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru