Complex (function): Difference between revisions

From APL Wiki
Jump to navigation Jump to search
(→‎History: Link and section for Hui's design exercises, and make it clear the next part is from another source)
m (Text replacement - "<source" to "<syntaxhighlight")
Line 1: Line 1:
{{Built-in|Complex|⌾}} is a [[dyadic]] [[scalar function]] which combines its arguments into a [[complex number]] having with the left argument as real part and the right argument as imaginary part. It was added to [[J]] as <source lang=j inline>j.</source> together with initial support for complex numbers, and was adopted in [[Extended Dyalog APL]] using the [[glyph]] <source lang=apl inline>⌾</source> because it was seen as a type of numerical [[Beside|composition]] (<source lang=apl inline>∘</source>) for the [[Circle|circular]] (<source lang=apl inline>○</source>) domain. Complex shares its glyph with [[Imaginary]] which is equivalent to applying Complex with a left argument of 0.
{{Built-in|Complex|⌾}} is a [[dyadic]] [[scalar function]] which combines its arguments into a [[complex number]] having with the left argument as real part and the right argument as imaginary part. It was added to [[J]] as <syntaxhighlight lang=j inline>j.</source> together with initial support for complex numbers, and was adopted in [[Extended Dyalog APL]] using the [[glyph]] <syntaxhighlight lang=apl inline>⌾</source> because it was seen as a type of numerical [[Beside|composition]] (<syntaxhighlight lang=apl inline>∘</source>) for the [[Circle|circular]] (<syntaxhighlight lang=apl inline>○</source>) domain. Complex shares its glyph with [[Imaginary]] which is equivalent to applying Complex with a left argument of 0.


== History ==
== History ==


The question of whether to include this function is one of [[Roger Hui]]'s 50 exercises in APL language design:<ref>[[Roger Hui]]. [https://www.jsoftware.com/papers/APLDesignExercises.htm Some Exercises in APL Language Design]. §8 Imaginary/Complex and sample answer. Jsoftware. 2016.</ref>
The question of whether to include this function is one of [[Roger Hui]]'s 50 exercises in APL language design:<ref>[[Roger Hui]]. [https://www.jsoftware.com/papers/APLDesignExercises.htm Some Exercises in APL Language Design]. §8 Imaginary/Complex and sample answer. Jsoftware. 2016.</ref>
<blockquote>Complex numbers can be constructed as ordered pairs of real numbers, similar to how integers can be constructed as ordered pairs of natural numbers and rational numbers as ordered pairs of integers. For complex numbers, <source lang=j inline>j.</source> plays the same role as <source lang=apl inline>-</source> for integers and <source lang=apl inline>÷</source> for rational numbers. </blockquote>
<blockquote>Complex numbers can be constructed as ordered pairs of real numbers, similar to how integers can be constructed as ordered pairs of natural numbers and rational numbers as ordered pairs of integers. For complex numbers, <syntaxhighlight lang=j inline>j.</source> plays the same role as <syntaxhighlight lang=apl inline>-</source> for integers and <syntaxhighlight lang=apl inline>÷</source> for rational numbers. </blockquote>
In a later blog post, Hui quoted [[Adám Brudzewsky]]:<ref>[[Roger Hui]]. [https://forums.dyalog.com/viewtopic.php?f=30&t=1786&p=7020&hilit=complex+imaginary#p7020 ⊕ and ⊗]. Dyalog Forums. 2021-06-13.</ref>
In a later blog post, Hui quoted [[Adám Brudzewsky]]:<ref>[[Roger Hui]]. [https://forums.dyalog.com/viewtopic.php?f=30&t=1786&p=7020&hilit=complex+imaginary#p7020 ⊕ and ⊗]. Dyalog Forums. 2021-06-13.</ref>
<blockquote>(…) I’d probably go for <source lang=apl inline>⊕</source> because:
<blockquote>(…) I’d probably go for <syntaxhighlight lang=apl inline>⊕</source> because:


* it is more clearly related to <source lang=apl inline>○</source> (for which the monadic form is also a simple multiplication)
* it is more clearly related to <syntaxhighlight lang=apl inline>○</source> (for which the monadic form is also a simple multiplication)
* it consists of two overstruck basic APL symbols
* it consists of two overstruck basic APL symbols
* it looks more harmonic (in my eyes)
* it looks more harmonic (in my eyes)


Oh, and Euler’s formula turns out beautiful (to my taste) with it:
Oh, and Euler’s formula turns out beautiful (to my taste) with it:
<source lang=apl>0 = 1+*⊕○1
<syntaxhighlight lang=apl>0 = 1+*⊕○1
0 = 1+*○⊕1</source></blockquote>
0 = 1+*○⊕1</source></blockquote>
Hui continues:
Hui continues:
<blockquote>
<blockquote>
On further reflection, I like the <source lang=apl inline>⊕</source> symbol for <source lang=apl inline>j←{⍺←0 ⋄ ⍺+0j1×⍵}</source>. If there are existing interpretation of it this one should predominate, if the function is as important as I think it is. (Peer to <source lang=apl inline>-</source> and <source lang=apl inline>÷</source>, etc.)
On further reflection, I like the <syntaxhighlight lang=apl inline>⊕</source> symbol for <syntaxhighlight lang=apl inline>j←{⍺←0 ⋄ ⍺+0j1×⍵}</source>. If there are existing interpretation of it this one should predominate, if the function is as important as I think it is. (Peer to <syntaxhighlight lang=apl inline>-</source> and <syntaxhighlight lang=apl inline>÷</source>, etc.)


Moreover, complex numbers are commonly represented by magnitude and phase. So if you have a magnitude and phase, how do you get the number so represented? Why <source lang=apl inline>k←{⍺←1 ⋄ ⍺×*0j1×⍵}</source> (or <source lang=apl inline>{⍺←1 ⋄ ⍺×*⊕⍵}</source>) of course. And what symbol would you use? <source lang=apl inline>⊗</source> (Monadic <source lang=apl inline>⊗</source>, with a default magnitude of 1, gets you a point on the unit circle.)
Moreover, complex numbers are commonly represented by magnitude and phase. So if you have a magnitude and phase, how do you get the number so represented? Why <syntaxhighlight lang=apl inline>k←{⍺←1 ⋄ ⍺×*0j1×⍵}</source> (or <syntaxhighlight lang=apl inline>{⍺←1 ⋄ ⍺×*⊕⍵}</source>) of course. And what symbol would you use? <syntaxhighlight lang=apl inline>⊗</source> (Monadic <syntaxhighlight lang=apl inline>⊗</source>, with a default magnitude of 1, gets you a point on the unit circle.)
</blockquote>
</blockquote>


== Examples ==
== Examples ==


[https://tio.run/##SyzI0U2pTMzJT9dNrShJzUtJTfn//1Hf1EdtEw6tN1KwVDBVeNSzT8FY4dB6EwWz//8B Try it online!]<source lang=apl>
[https://tio.run/##SyzI0U2pTMzJT9dNrShJzUtJTfn//1Hf1EdtEw6tN1KwVDBVeNSzT8FY4dB6EwWz//8B Try it online!]<syntaxhighlight lang=apl>
       ¯2 9 5 ⌾ 3 ¯4 6
       ¯2 9 5 ⌾ 3 ¯4 6
¯2J3 9J¯4 5J6
¯2J3 9J¯4 5J6

Revision as of 21:11, 10 September 2022

Complex () is a dyadic scalar function which combines its arguments into a complex number having with the left argument as real part and the right argument as imaginary part. It was added to J as <syntaxhighlight lang=j inline>j.</source> together with initial support for complex numbers, and was adopted in Extended Dyalog APL using the glyph <syntaxhighlight lang=apl inline>⌾</source> because it was seen as a type of numerical composition (<syntaxhighlight lang=apl inline>∘</source>) for the circular (<syntaxhighlight lang=apl inline>○</source>) domain. Complex shares its glyph with Imaginary which is equivalent to applying Complex with a left argument of 0.

History

The question of whether to include this function is one of Roger Hui's 50 exercises in APL language design:[1]

Complex numbers can be constructed as ordered pairs of real numbers, similar to how integers can be constructed as ordered pairs of natural numbers and rational numbers as ordered pairs of integers. For complex numbers, <syntaxhighlight lang=j inline>j.</source> plays the same role as <syntaxhighlight lang=apl inline>-</source> for integers and <syntaxhighlight lang=apl inline>÷</source> for rational numbers.

In a later blog post, Hui quoted Adám Brudzewsky:[2]

(…) I’d probably go for <syntaxhighlight lang=apl inline>⊕</source> because:

  • it is more clearly related to <syntaxhighlight lang=apl inline>○</source> (for which the monadic form is also a simple multiplication)
  • it consists of two overstruck basic APL symbols
  • it looks more harmonic (in my eyes)

Oh, and Euler’s formula turns out beautiful (to my taste) with it: <syntaxhighlight lang=apl>0 = 1+*⊕○1

0 = 1+*○⊕1</source>

Hui continues:

On further reflection, I like the <syntaxhighlight lang=apl inline>⊕</source> symbol for <syntaxhighlight lang=apl inline>j←{⍺←0 ⋄ ⍺+0j1×⍵}</source>. If there are existing interpretation of it this one should predominate, if the function is as important as I think it is. (Peer to <syntaxhighlight lang=apl inline>-</source> and <syntaxhighlight lang=apl inline>÷</source>, etc.)

Moreover, complex numbers are commonly represented by magnitude and phase. So if you have a magnitude and phase, how do you get the number so represented? Why <syntaxhighlight lang=apl inline>k←{⍺←1 ⋄ ⍺×*0j1×⍵}</source> (or <syntaxhighlight lang=apl inline>{⍺←1 ⋄ ⍺×*⊕⍵}</source>) of course. And what symbol would you use? <syntaxhighlight lang=apl inline>⊗</source> (Monadic <syntaxhighlight lang=apl inline>⊗</source>, with a default magnitude of 1, gets you a point on the unit circle.)

Examples

Try it online!<syntaxhighlight lang=apl>

     ¯2 9 5 ⌾ 3 ¯4 6

¯2J3 9J¯4 5J6

</source>

Documentation

References

  1. Roger Hui. Some Exercises in APL Language Design. §8 Imaginary/Complex and sample answer. Jsoftware. 2016.
  2. Roger Hui. ⊕ and ⊗. Dyalog Forums. 2021-06-13.
APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare RootRound
Dyadic AddSubtractTimesDivideResiduePowerLogarithmMinimumMaximumBinomialComparison functionsBoolean functions (And, Or, Nand, Nor) ∙ GCDLCMCircularComplexRoot
Non-Scalar
Structural ShapeReshapeTallyDepthRavelEnlistTableCatenateReverseRotateTransposeRazeMixSplitEncloseNestCut (K)PairLinkPartitioned EnclosePartition
Selection FirstPickTakeDropUniqueIdentityStopSelectReplicateExpandSet functions (IntersectionUnionWithout) ∙ Bracket indexingIndexCartesian ProductSort
Selector Index generatorGradeIndex OfInterval IndexIndicesDealPrefix and suffix vectors
Computational MatchNot MatchMembershipFindNub SieveEncodeDecodeMatrix InverseMatrix DivideFormatExecuteMaterialiseRange
Operators Monadic EachCommuteConstantReplicateExpandReduceWindowed ReduceScanOuter ProductKeyI-BeamSpawnFunction axisIdentity (Null, Ident)
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)Identity (Lev, Dex)
Quad names Index originComparison toleranceMigration levelAtomic vector