Conjugate: Difference between revisions

Jump to navigation Jump to search
548 bytes added ,  22:23, 10 September 2022
m
Text replacement - "</source>" to "</syntaxhighlight>"
m (Text replacement - "{{APL built-ins}}" to "{{APL built-ins}}Category:Primitive functions")
m (Text replacement - "</source>" to "</syntaxhighlight>")
(7 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 ==


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.
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 ==
* [[Circular]]
* [[Complex (function)|Complex]]
* [[Imaginary]]


== External links ==
== External links ==
Line 48: Line 53:
=== Mathematics ===
=== Mathematics ===


* [[wikipedia:Complex_conjugation|Wikipedia]]
* [[wikipedia:Complex conjugation|Complex conjugation]]


=== Documentation ===
=== Documentation ===


* [http://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Conjugate.htm Dyalog]
* [https://help.dyalog.com/latest/index.htm#Language/Primitive%20Functions/Conjugate.htm Dyalog]


* [http://microapl.com/apl_help/ch_020_020_010.htm APLX]
* [http://microapl.com/apl_help/ch_020_020_010.htm APLX]
Line 58: Line 63:
* [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]


{{APL built-ins}}[[Category:Primitive functions]]
* [https://mlochbaum.github.io/BQN/doc/arithmetic.html#basic-arithmetic BQN]
 
{{APL built-ins}}[[Category:Primitive functions]][[Category:Scalar monadic functions]]

Navigation menu