Nano Hash - криптовалюты, майнинг, программирование

Обозначение комплексного числа

Мое приложение DotNET имеет ограниченный встроенный язык сценариев (по образцу VBScript), в основном для постобработки чисел, точек и векторов. Я только что добавил поддержку комплексных чисел, но я борюсь с обозначениями.

Я не хочу использовать обозначение A + Bi, поскольку это не является четким разделением, если A или B уже определены как уравнения:

31 * 5 + 6 + -5i

Это можно интерпретировать как:

A = 31 * 5 + 6 B = -5i

а также:

A = 31 * 5 B = 6 + -5i

Ни один из известных мне языков программирования не имеет встроенной поддержки комплексных чисел. Я думаю, что что-то вроде следующего может сработать, но я был бы признателен за любой вклад в это:

{31 * 5} + {6 + -5}i

сложный(31*5, 6+-5)

r{31 * 5} i{6 + -5}


  • Будут ли полярные координаты лучше, чем прямоугольные координаты? Просто еще один способ выразить такие числа. 21.09.2009
  • @JB, не знаю. Может быть. Я, конечно, могу добавить еще один синтаксис, который позволяет вам определять комплексное число по углу + расстоянию. Однако нотация по умолчанию использует действительную и мнимую компоненты. 21.09.2009
  • C имеет родные комплексные числа начиная с C99. Как и Фортран. 21.09.2009
  • @lhf, как определить комплексное число в C или Fortran? 21.09.2009
  • не должен его видеть, потому что я прочитал 31 * 5 + 6 + -5i как 161 - 5i, что без каких-либо круглых скобок в уравнении является (довольно) стандартным способом его интерпретации, учитывая довольно хороший приоритет операторов всех языков. Если вы видите это как 155 * (6 - 5i), то вы ошибаетесь с восприятием людьми приоритета оператора. 21.09.2009
  • @ Дэвид Руттен, см. gnu.org/s/libc/manual /html_node/Complex-Numbers.html и docs.sun.com/app/docs/doc/802-5662/6i9dg8itg?a=view 21.09.2009
  • Кстати, для Lua есть библиотека комплексных чисел. См. tecgraf.puc-rio.br/~lhf/ftp/ луа/#lcomplex 21.09.2009

Ответы:


1

Кажется, вы используете явное умножение в своих примерах (т.е. вам требуется A * B, а не AB).

В таком случае, почему бы просто не использовать суффикс i сразу после значения, как в

 myComplex = 12 + 6i
   or
 myOtherComplex = 12/7 + (6 * pi)i

Тогда вам, возможно, придется решить, i или j, я видел оба...

Этот трюк с суффиксом i мало чем отличается от научного уведомления и представляет собой e (например, 3.1415e7).

Изменить (после комментариев Дэвида)

Приведенный выше формат может сбивать с толку, в зависимости от аудитории. Один из способов прояснить это может заключаться в разрешении только воображаемых литералов и включении их в сложные нотация, полученная из вашей существующей векторной нотации. Когда мнимые числа или комплексные числа требуют выражения для их обозначения, синтаксис требует явного "функционального" синтаксиса, такого как Imaginary(i) и Complex(r, i).

Правила синтаксического анализа:

  • Любое число (со знаком или без знака, целое или десятичное или даже число в эксп. записи), за которым непосредственно следует суффикс i, является воображаемым числом: -7i или 1,23i или 5,76e4i, но не 12 i (между числом и суффиксом не допускается пробел)
  • вектор с двумя значениями, первое из которых действительное, а второе мнимое, представляет собой комплекс: (1, 7i) или даже (7, 0i)
  • Формат Imaginary(i) используется, когда значение "i" является выражением. i выражается без суффикса i, который подразумевается синтаксисом вызова метода.
  • Формат Complex(r,i) используется, когда параметры "r" или "i" являются/являются выражением, а также всякий раз, когда мы хотим избежать двусмысленности.

Короче:

  • (7, 1i), (0, -3,1415i), (13, 0i), Complex(13, 0) или Complex(7x+3, sin(y)+2) — все это комплексные числа.
  • 6i, -1.234e5i, Imaginary(1.234) или Imaginary(sqrt(19x+5y)) — все мнимые числа
  • (12, 23, 34) — вектор в R^3
  • (12i, -2i) в векторе из I^2 (не комплексное число, так как первый элемент недействителен)
  • ((0,0i), (1,-9.2i), (12, 0i)) или ((0, 21i), Complex(12,3), (44, -55i)) являются векторами в C^3

Это кажется последовательным и достаточно простым, но опять же, только настоящие конечные пользователи могут сказать.

20.09.2009
  • @mjv, интересная идея. Это, безусловно, обеспечивает очень гибкую нотацию. Однако я боюсь, что таким образом становится слишком легко совершать синтаксические ошибки. Это будет путать людей. 21.09.2009
  • @David R: см. мой второй подход ... Просто предложение, конечно, вы знаете своих пользователей лучше, чем я ... 21.09.2009

  • 2

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

    • Заключите число в круглые скобки, чтобы гарантировать, что оно рассматривается как единица. Например, 6+5i становится {6,5} или {6,5i} для удобства чтения.
    • Введите маркер для разделения частей, аналогичный показателю степени в 6.022e23. Например, 6+5i становится 6i5. Вам все равно понадобятся круглые скобки, чтобы указать формулы для этого, например, 6 + (b/2)i становится 6i(b/2), а не сбивающим с толку 6ib/2 (которое также можно прочитать как (6ib)/2) и, к сожалению, вы перестанете использовать i как переменную.

    Любой из них было бы просто обработать даже с помощью простого синтаксического анализатора, и они достаточно близки к математической нотации, чтобы не запутаться. Я предпочитаю первый вариант, так как он кажется мне более точным и использует символы, которые вряд ли вызовут путаницу.

    20.09.2009
  • @Пакс, спасибо. Я думаю, что метод скобок будет работать лучше всего. Я не буду использовать суффикс i, так как в некоторых случаях это может привести к путанице. 21.09.2009

  • 3

    У ваших пользователей есть определенные обозначения, которые они используют? Не могли бы вы выбрать что-то максимально близкое к их? В моем случае я бы использовал + bi, поэтому я бы сказал {31 * 5} + {6 + -5}i, однако, если они привыкли к функциональной форме, я предлагаю комплекс (31 * 5, 6 + -5). ).

    Поскольку вы используете .net, возможно, вы захотите использовать DLR, чтобы дать вашему сценарию python или рубиновый синтаксис?

    20.09.2009
  • Комплексные числа не были доступны до сих пор, поэтому пока нет синтаксиса. Точки и векторы записываются как {x, y, z}. Комплексные числа могут быть {a, b}, что красиво и коротко, но, к сожалению, не очень самодокументируемо. Комплекс (,) хорош, хотя. Пишу на DotNET, но интерпретатор скриптового языка написал сам. Мне понадобилось множество специальных операторов (факториал, квадрат, кросс-произведение, скалярное произведение, переназначение плоскости и т. д. и т. д.). Кроме того, поскольку большинство моих пользователей имеют опыт работы с VB, я хотел что-то похожее на обычный VBScript до тех пор, пока вы используете специальные функции. 21.09.2009
  • На самом деле я думал о том, как пользователи в настоящее время обычно используют комплексные числа (не в вашем приложении). 22.09.2009

  • 4

    Большинство языков, которые я могу найти, имеют встроенный тип комплексных чисел (например, Python и Lisp), используют что-то вроде:

    c{r, i}
    
    21.09.2009
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..