Conjugate: Difference between revisions

From APL Wiki
Jump to navigation Jump to search
m (Text replacement - "http://help.dyalog.com" to "https://help.dyalog.com")
m (Text replacement - "</source>" to "</syntaxhighlight>")
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Built-in|Conjugate|+}} is a [[monadic]] [[scalar function]] which negates the imaginary component of a [[complex]] argument. Because many APLs do not have a dedicated [[Identity]] function, but also do not support complex numbers, Conjugate is often used to return the argument unchanged. This usage is discouraged in modern APLs in favor of the Identity function (usually <source lang=apl inline>⊢</source>). Conjugate shares the glyph <source lang=apl inline>+</source> with [[Add]].
{{Built-in|Conjugate|+}} is a [[monadic]] [[scalar function]] which negates the imaginary component of a [[complex]] argument. Because many APLs do not have a dedicated [[Identity]] function, but also do not support complex numbers, Conjugate is often used to return the argument unchanged. This usage is discouraged in modern APLs in favor of the Identity function (usually <syntaxhighlight lang=apl inline>⊢</syntaxhighlight>). Conjugate shares the glyph <syntaxhighlight lang=apl inline>+</syntaxhighlight> with [[Add]].


== Examples ==
== Examples ==


Conjugate leaves real numbers unchanged but negates the imaginary part of complex numbers.
Conjugate leaves real numbers unchanged but negates the imaginary part of complex numbers.
<source lang=apl>
<syntaxhighlight lang=apl>
       + 0 2 ¯1.1 1E300 ¯200
       + 0 2 ¯1.1 1E300 ¯200
0 2 ¯1.1 1E300 ¯200
0 2 ¯1.1 1E300 ¯200
       + 2J3 ¯4J¯3 ¯12 1.5J1.5
       + 2J3 ¯4J¯3 ¯12 1.5J1.5
2J¯3 ¯4J3 ¯12 1.5J¯1.5
2J¯3 ¯4J3 ¯12 1.5J¯1.5
</source>
</syntaxhighlight>


== As identity function ==
== As identity function ==


In early APLs Conjugate was frequently used to return the argument unchanged, for example to display a [[shy]] result or break up [[stranding]]:
In early APLs Conjugate was frequently used to return the argument unchanged, for example to display a [[shy]] result or break up [[stranding]]:
<source lang=apl>
<syntaxhighlight lang=apl>
       +a←2 3
       +a←2 3
2 3
2 3
       *∘2⍣3 +a
       *∘2⍣3 +a
256 6561
256 6561
</source>
</syntaxhighlight>
Sometimes the name "Identity" was even used for <source lang=apl inline>+</source>. Although this usage is becoming rare among new APLers, it may still affect the behavior of Conjugate. For instance, in [[Dyalog APL]], Conjugate will allow a non-numeric argument and return it unchanged even though other monadic scalar functions give a [[DOMAIN ERROR]]:
Sometimes the name "Identity" was even used for <syntaxhighlight lang=apl inline>+</syntaxhighlight>. Although this usage is becoming rare among new APLers, it may still affect the behavior of Conjugate. For instance, in [[Dyalog APL]], Conjugate will allow a non-numeric argument and return it unchanged even though other monadic scalar functions give a [[DOMAIN ERROR]]:
<source lang=apl>
<syntaxhighlight lang=apl>
       + ⎕NULL
       + ⎕NULL
[Null]
[Null]
Line 28: Line 28:
       -⎕NULL
       -⎕NULL
       ∧
       ∧
</source>
</syntaxhighlight>


== Properties ==
== Properties ==
Line 34: Line 34:
Like [[Negate]], Conjugate is its own [[Inverse]].
Like [[Negate]], Conjugate is its own [[Inverse]].


The conjugate of a number is proportional to (that is, a real multiple of) its [[Reciprocal]]. Specifically, since for any complex number <source lang=apl inline>z</source>, <source lang=apl inline>z×+z</source> {{←→}} <source lang=apl inline>(+z)×z</source> is a real number (the square of the [[Magnitude]] of <source lang=apl inline>z</source>), we have <source lang=apl inline>z×((+z)÷z×+z)</source> {{←→}} <source lang=apl inline>1</source>, so by definition <source lang=apl inline>(+z)÷z×+z</source> is <source lang=apl inline>÷z</source>. If <source lang=apl inline>z</source> is a unit complex number (for instance the result of [[Signum]]), then <source lang=apl inline>+z</source> {{←→}} <source lang=apl inline>÷z</source>.
The conjugate of a number is proportional to (that is, a real multiple of) its [[Reciprocal]]. Specifically, since for any complex number <syntaxhighlight lang=apl inline>z</syntaxhighlight>, <syntaxhighlight lang=apl inline>z×+z</syntaxhighlight> {{←→}} <syntaxhighlight lang=apl inline>(+z)×z</syntaxhighlight> is a real number (the square of the [[Magnitude]] of <syntaxhighlight lang=apl inline>z</syntaxhighlight>), we have <syntaxhighlight lang=apl inline>z×((+z)÷z×+z)</syntaxhighlight> {{←→}} <syntaxhighlight lang=apl inline>1</syntaxhighlight>, so by definition <syntaxhighlight lang=apl inline>(+z)÷z×+z</syntaxhighlight> is <syntaxhighlight lang=apl inline>÷z</syntaxhighlight>. If <syntaxhighlight lang=apl inline>z</syntaxhighlight> is a unit complex number (for instance the result of [[Signum]]), then <syntaxhighlight lang=apl inline>+z</syntaxhighlight> {{←→}} <syntaxhighlight lang=apl inline>÷z</syntaxhighlight>.


== Hypercomplex numbers ==
== Hypercomplex numbers ==


The conjugate of a hypercomplex number (a quaternion or octonion) negates ''all'' imaginary components, that is, every component but the real part. Somewhat surprisingly, this maintains the property that <source lang=apl inline>z×+z</source> {{←→}} <source lang=apl inline>(+z)×z</source> is a real number. Therefore the conjugate can be used to define the [[reciprocal]] of a complex number using only real division (dividing a hypercomplex number by a real number divides each component by that numer).
The conjugate of a hypercomplex number (a quaternion or octonion) negates ''all'' imaginary components, that is, every component but the real part. Somewhat surprisingly, this maintains the property that <syntaxhighlight lang=apl inline>z×+z</syntaxhighlight> {{←→}} <syntaxhighlight lang=apl inline>(+z)×z</syntaxhighlight> is a real number. Therefore the conjugate can be used to define the [[reciprocal]] of a complex number using only real division (dividing a hypercomplex number by a real number divides each component by that numer).


== Numerical precision ==
== Numerical precision ==
Line 62: Line 62:


* [https://www.jsoftware.com/help/dictionary/d100.htm J Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/plus J NuVoc]
* [https://www.jsoftware.com/help/dictionary/d100.htm J Dictionary], [https://code.jsoftware.com/wiki/Vocabulary/plus J NuVoc]
* [https://mlochbaum.github.io/BQN/doc/arithmetic.html#basic-arithmetic BQN]


{{APL built-ins}}[[Category:Primitive functions]][[Category:Scalar monadic functions]]
{{APL built-ins}}[[Category:Primitive functions]][[Category:Scalar monadic functions]]

Revision as of 22:23, 10 September 2022

+

Conjugate (+) is a monadic scalar function which negates the imaginary component of a complex argument. Because many APLs do not have a dedicated Identity function, but also do not support complex numbers, Conjugate is often used to return the argument unchanged. This usage is discouraged in modern APLs in favor of the Identity function (usually ). Conjugate shares the glyph + with Add.

Examples

Conjugate leaves real numbers unchanged but negates the imaginary part of complex numbers.

      + 0 2 ¯1.1 1E300 ¯200
0 2 ¯1.1 1E300 ¯200
      + 2J3 ¯4J¯3 ¯12 1.5J1.5
2J¯3 ¯4J3 ¯12 1.5J¯1.5

As identity function

In early APLs Conjugate was frequently used to return the argument unchanged, for example to display a shy result or break up stranding:

      +a←2 3
2 3
      *∘2⍣3 +a
256 6561

Sometimes the name "Identity" was even used for +. Although this usage is becoming rare among new APLers, it may still affect the behavior of Conjugate. For instance, in Dyalog APL, Conjugate will allow a non-numeric argument and return it unchanged even though other monadic scalar functions give a DOMAIN ERROR:

      + ⎕NULL
[Null]
      - ⎕NULL
DOMAIN ERROR
      -⎕NULL
      ∧

Properties

Like Negate, Conjugate is its own Inverse.

The conjugate of a number is proportional to (that is, a real multiple of) its Reciprocal. Specifically, since for any complex number z, z×+z (+z)×z is a real number (the square of the Magnitude of z), we have z×((+z)÷z×+z) 1, so by definition (+z)÷z×+z is ÷z. If z is a unit complex number (for instance the result of Signum), then +z ÷z.

Hypercomplex numbers

The conjugate of a hypercomplex number (a quaternion or octonion) negates all imaginary components, that is, every component but the real part. Somewhat surprisingly, this maintains the property that z×+z (+z)×z is a real number. Therefore the conjugate can be used to define the reciprocal of a complex number using only real division (dividing a hypercomplex number by a real number divides each component by that numer).

Numerical precision

Like Negate, Conjugate almost never suffers issues with numerical precision. This is because negating a component of a complex number is exact in all common number systems.

See also

External links

Mathematics

Documentation


APL built-ins [edit]
Primitives (Timeline) Functions
Scalar
Monadic ConjugateNegateSignumReciprocalMagnitudeExponentialNatural LogarithmFloorCeilingFactorialNotPi TimesRollTypeImaginarySquare Root
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 axis
Dyadic BindCompositions (Compose, Reverse Compose, Beside, Withe, Atop, Over) ∙ Inner ProductDeterminantPowerAtUnderRankDepthVariantStencilCutDirect definition (operator)
Quad names Index originComparison toleranceMigration levelAtomic vector