Как оперировать знаками действий?

Форум пользователей пакета Maple

Модератор: Admin

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Как оперировать знаками действий?

Сообщение berg » Пн окт 22, 2012 6:18 pm

В своих расчетах Мэпл использует числа как аргументы, то есть оперирует только числами, а знаки математических действий являются неизменяемым условием его программы. Существует ли оператор, который превращает знаки действий в аргументы?
Короче говоря, можно ли с помощью Мэпла решать задачи такого, например, вида: Даны пять троек (3,3,3,3,3). Расставить знаки действий между тройками так, чтобы результатом было число 1000.
Знаки действий: + - * / ^ sqrt !

Markiyan Hirnyk
Сообщения: 1322
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Как оперировать знаками действий?

Сообщение Markiyan Hirnyk » Пн окт 22, 2012 7:43 pm

berg писал(а):В своих расчетах Мэпл использует числа как аргументы, то есть оперирует только числами, а знаки математических действий являются неизменяемым условием его программы. Существует ли оператор, который превращает знаки действий в аргументы?
Короче говоря, можно ли с помощью Мэпла решать задачи такого, например, вида: Даны пять троек (3,3,3,3,3). Расставить знаки действий между тройками так, чтобы результатом было число 1000.
Знаки действий: + - * / ^ sqrt !
Как со скобками? Допустимо ли, например, выражение sqrt(3+3) ?

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Пн окт 22, 2012 9:29 pm

Допустимо и со скобками и без них.
Это не принципиально.

Markiyan Hirnyk
Сообщения: 1322
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Принципиально

Сообщение Markiyan Hirnyk » Вт окт 23, 2012 1:25 am

berg писал(а):Допустимо и со скобками и без них.
Это не принципиально.
Принципиально. Пожалуйста, покажите возможную композицию.
Скажем, это подходит(3+3)*3^(3^3) ? А это -
(3+3)*(3^3)^3 ?

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Вт окт 23, 2012 1:37 pm

Вы меня совсем не поняли.
Речь идет о том, можно ли решать такие задачи средствами Мэпла. Я могу решать такие задачи, но может ли это делать Мэпл?
Задача на перебор вариантов знаков действий между числами. Для данного примера на экране должно появиться такое решение:
((3^3+3)/3)^3=1000

Сергей46
Сообщения: 9
Зарегистрирован: Пт июл 13, 2012 7:49 pm

Сообщение Сергей46 » Вт окт 23, 2012 3:42 pm

Из-за отсутствия времени привожу набросок одной идеи, решающей вашу задачу. Правда, для получения нужного результата можно ждать очень долго, хотя идея работает, если решение существует, ибо не всегда такого типа задачи имеют решение. Данная процедура допускает различные интересные модификации и обобщения. Успеха.

> P := proc(x, y, z, t, h, Res) local a,b,c,n,k;
a:=["+","-","*","^","/"]; n:=rand(1..4);
for k to 10^6 do b := cat(convert(x, string), convert(a[n()], string), convert(y, string), convert(a[n()], string), convert(z, string), convert(a[n()], string), convert(t, string), convert(a[n()], string), convert(h, string));
try c:= parse(b) catch :next end try; print(c);
if c = Res then return b end if end do end proc:


> P(3, 3, 3, 3, 3, 1000);
-240
2187
246
87
240
====

Сергей46
Сообщения: 9
Зарегистрирован: Пт июл 13, 2012 7:49 pm

Сообщение Сергей46 » Вт окт 23, 2012 4:30 pm

Для вашего случая можно даже проще;

> P := proc(x, y, z, t, h, Res) local a, b, c, n, k;
a := ["+", "-", "*", "^", "/"]; n := rand(1..4);
for k to 10^6 do b := cat(convert(x, string), a[n()], convert(y, string), a[n()], convert(z, string), a[n()], convert(t, string), a[n()], convert(h, string));
try c := parse(b) catch : next end try;
if c = Res then return b end if end do end proc:


> P(3,3,3,3,3,240);
"3*3^3*3-3"

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Вт окт 23, 2012 8:08 pm

Спасибо, Сергей46!
Идея работает, хотя часто не находит простых и очевидных решений.
Я, честно говоря, не ожидал, что Мэпл на такое способен. Если это направление довести до совершенства, откроются новые возможности в научных исследованиях.

Aivar
Сообщения: 48
Зарегистрирован: Вт июл 13, 2004 4:00 pm

Сообщение Aivar » Пт ноя 02, 2012 7:04 pm

Ув. Berg! Сергей46 предложил интересную идею, реализованную процедурно. Со своей стороны можно обратить внимание на подобного рода процедуру Choice Аладьева для Mathematica, с которой познакомился на его мастер-классе в 2008. Вот ее краткое описание.

Процедура Choice предназначена для вычисления кортежей целых чисел, разделенных знаками арифметических операций, с помощью которых можно получать требуемое целое число. Вызов Choice[R, n1, n2, n3, …, nj] возвращает строку формата S = "m1 O[1] m2 O[2] … mj O[j]" такую, что ToExpression[S] ≡ R, где mk – целое из кортежа {n1, n2, n3, …, nj} и O[k] – арифметическая операция из {"+", "–", "*", "/", "^"}; k=1..j.

Учитывая ваш интерес к подобным вопросам, решил вас проинформировать.

Aivar
Сообщения: 48
Зарегистрирован: Вт июл 13, 2004 4:00 pm

Сообщение Aivar » Пт ноя 02, 2012 10:44 pm

Прошу прощения, переписывая текст из конспекта, автоматически или по инерции сделал ошибку. Должно быть так:

Процедура Choice предназначена для вычисления кортежей целых чисел, разделенных знаками арифметических операций, с помощью которых можно получать требуемое целое число. Вызов Choice[R, n1, n2, n3, …, nj] возвращает строку формата S = "m1 O[1] m2 O[2] … mj" такую, что ToExpression[S] ≡ R, где mk – целое из кортежа {n1, n2, n3, …, nj} и O[k] – арифметическая операция из {"+", "–", "*", "/", "^"}; k=1..j.

berg
Сообщения: 37
Зарегистрирован: Чт янв 19, 2012 8:33 pm

Сообщение berg » Сб ноя 03, 2012 9:04 am

Aivar, спасибо за информацию.
К сожалению, мне не всё понятно.
Если можно, поясните сказанное на конкретном примере.

Aivar
Сообщения: 48
Зарегистрирован: Вт июл 13, 2004 4:00 pm

Сообщение Aivar » Сб ноя 03, 2012 11:16 am

In[2030]:= Choice[125, 1, 2, 3, 4, 5]

Out[2030]= "1^2^4*5^3"


Правда, в большинстве случаев требуется немало времени, при отсутствии решения имеем бесконечный цикл. Процедура Choice давалась для иллюстрации программной обработки особых ситуаций (раздел курса "Программная обработка особых и ошибочных ситуаций").