Euler's identity: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(42 intermediate revisions by 23 users not shown)
Line 3:
 
 
In mathematics,   ''Euler's identity''   (also known as   ''Euler's equation'')   is the equality:
 
<span style="font-size:150%;font-style:bold;"><span style="font-style:italic">e<sup>i<math>\pi</math></sup></span> + 1 = 0</span>
Line 27:
 
If that is the case, or there is some other limitation, show
that &nbsp; <big>e<sup>i<math>\pi</math></sup> + 1</big> &nbsp; is ''approximately'' equal to zero and
show the amount of error in the calculation.
 
If your language is capable of symbolic calculations, show
that &nbsp; <big>e<sup>i<math>\pi</math></sup> + 1</big> &nbsp; is ''exactly'' equal to zero for bonus kudos points.
<br><br>
 
Line 37:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">print(math:e ^ (math:pi * 1i) + 1)</langsyntaxhighlight>
 
{{out}}
Line 43:
1.22465e-16i
</pre>
 
=={{header|Ada}}==
<syntaxhighlight lang="ada">with Ada.Long_Complex_Text_IO; use Ada.Long_Complex_Text_IO;
with Ada.Numerics; use Ada.Numerics;
with Ada.Numerics.Long_Complex_Types; use Ada.Numerics.Long_Complex_Types;
with Ada.Numerics.Long_Complex_Elementary_Functions; use Ada.Numerics.Long_Complex_Elementary_Functions;
procedure Eulers_Identity is
begin
Put (Exp (Pi * i) + 1.0);
end Eulers_Identity;</syntaxhighlight>
 
{{out}}
<pre>( 0.00000000000000E+00, 1.22464679914735E-16)</pre>
 
=={{header|ALGOL 68}}==
Line 48 ⟶ 61:
<br>
We could use the identity exp(x + iy) = exp(x)( cos y + i sin y ), however the following uses a series expansion for exp(ix).
<langsyntaxhighlight lang="algol68">BEGIN
# calculate an approximation to e^(i pi) + 1 which should be 0 (Euler's identity) #
 
Line 100 ⟶ 113:
)
)
END</langsyntaxhighlight>
{{out}}
<pre>
e^(i*pi) + 1 ~ 0.00000000000000000307 -0.00000000000000002926i
</pre>
 
=={{header|Bracmat}}==
<syntaxhighlight lang="bracmat">e^(i*pi)+1</syntaxhighlight>By symbolic calculation:<pre>0</pre>
 
=={{header|C}}==
Line 110 ⟶ 126:
 
The following code has been tested with gcc 5.4.0 on Ubuntu 16.04.
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <math.h>
#include <complex.h>
Line 123 ⟶ 139:
printf("e ^ %lci + 1 = [%.16f, %.16f] %lc 0\n", pi, creal(e), cimag(e), ae);
return 0;
}</langsyntaxhighlight>
 
{{output}}
Line 130 ⟶ 146:
</pre>
 
=={{header|C++ sharp|C#}}==
<syntaxhighlight lang="csharp">using System;
<lang cpp>#include <iostream>
#include <complex>
 
int main() {
std::cout << std::exp(std::complex<double>(0.0, M_PI)) + 1.0 << std::endl;
return 0;
}</lang>
 
{{output}}
Zero and a little floating dust ...
<pre>
(0,1.22465e-16)
</pre>
 
 
=={{header|C sharp}}==
<lang csharp>using System;
using System.Numerics;
 
Line 158:
Console.WriteLine(Complex.Pow(e, i * π) + 1);
}
}</langsyntaxhighlight>
{{out}}
<pre>
(0, 1.22464679914735E-16)
</pre>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">#include <iostream>
#include <complex>
 
int main() {
std::cout << std::exp(std::complex<double>(0.0, M_PI)) + 1.0 << std::endl;
return 0;
}</syntaxhighlight>
 
{{output}}
Zero and a little floating dust ...
<pre>
(0,1.22465e-16)
</pre>
 
=={{header|Common Lisp}}==
Common Lisp has complex number arithmetic built into it.
<syntaxhighlight lang="common lisp">
<lang Common Lisp>
(+ 1 (exp (complex 0 pi)))
</syntaxhighlight>
</lang>
<pre>
#C(0.0L0 -5.0165576136843360246L-20)
</pre>
=={{header|Delphi}}==
{{libheader| System.VarCmplx}}
<syntaxhighlight lang="delphi">
program Euler_identity;
 
{$APPTYPE CONSOLE}
 
uses
System.VarCmplx;
 
begin
var result := VarComplexExp(Pi * VarComplexCreate(0, 1)) + 1;
writeln(result);
readln;
end.</syntaxhighlight>
{{out}}
<pre>0 + 0i</pre>
 
=={{header|F_Sharp|F#}}==
As per the discussion page this task as described is to show that -1+1=0
<syntaxhighlight lang="fsharp">
printfn "-1 + 1 = %d" (-1+1)
</syntaxhighlight>
{{out}}
<pre>
-1 + 1 = 0
</pre>
I shall also show that cos π = -1 and sin π = 0
<syntaxhighlight lang="fsharp">
printfn "cos(pi)=%f and sin(pi)=%f" (cos 3.141592653589793) (sin 3.141592653589793)
</syntaxhighlight>
{{out}}
<pre>
cos(pi)=-1.000000 and sin(pi)=0.000000
</pre>
I shall try the formula e<sup>iπ</sup>. I'll use the MathNet.Numerics package. I'll leave you the reader to determine what it 'proves'.
<syntaxhighlight lang="fsharp">
let i =MathNet.Numerics.complex(0.0,1.0);;
let pi=MathNet.Numerics.complex(MathNet.Numerics.Constants.Pi,0.0);;
let e =MathNet.Numerics.complex(MathNet.Numerics.Constants.E ,0.0);;
printfn "e**(i*pi) = %A" (e**(i*pi));;
</syntaxhighlight>
{{out}}
<pre>
e**(i*pi) = (-1, 1.2246467991473532E-16)
</pre>
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: math math.constants math.functions prettyprint ;
1 e pi C{ 0 1 } * ^ + .</langsyntaxhighlight>
{{out}}
<pre>
C{ 0.0 1.224646799147353e-016 }
</pre>
 
=={{header|Forth}}==
Uses fs. (scientific) to print the imaginary term, since that's the one that's inexact.
<syntaxhighlight lang="forth">
." e^(i*π) + 1 = " pi fcos 1e0 f+ f. '+ emit space pi fsin fs. 'i emit cr
bye
</syntaxhighlight>
{{Out}}
<pre>
e^(i*π) + 1 = 0. + 1.22464679914735E-16 i
</pre>
 
=={{header|Fortran}}==
<syntaxhighlight lang="fortran">
program euler
use iso_fortran_env, only: output_unit, REAL64
implicit none
 
integer, parameter :: d=REAL64
real(kind=d), parameter :: e=exp(1._d), pi=4._d*atan(1._d)
complex(kind=d), parameter :: i=(0._d,1._d)
 
write(output_unit,*) e**(pi*i) + 1
end program euler
</syntaxhighlight>
{{out}}
<pre>
(0.0000000000000000,2.89542045005908316E-016)
</pre>
 
=={{header|FreeBASIC}}==
 
Provides complex arithmetic and a very rapidly converging algorithm for e^z.
 
<syntaxhighlight lang="freebasic">#define PI 3.141592653589793238462643383279502884197169399375105821
#define MAXITER 12
 
'---------------------------------------
' complex numbers and their arithmetic
'---------------------------------------
 
type complex
r as double
i as double
end type
 
function conj( a as complex ) as complex
dim as complex c
c.r = a.r
c.i = -a.i
return c
end function
 
operator + ( a as complex, b as complex ) as complex
dim as complex c
c.r = a.r + b.r
c.i = a.i + b.i
return c
end operator
 
operator - ( a as complex, b as complex ) as complex
dim as complex c
c.r = a.r - b.r
c.i = a.i - b.i
return c
end operator
 
operator * ( a as complex, b as complex ) as complex
dim as complex c
c.r = a.r*b.r - a.i*b.i
c.i = a.i*b.r + a.r*b.i
return c
end operator
 
operator / ( a as complex, b as complex ) as complex
dim as double bcb = (b*conj(b)).r
dim as complex acb = a*conj(b), c
c.r = acb.r/bcb
c.i = acb.i/bcb
return c
end operator
 
sub printc( a as complex )
if a.i>=0 then
print using "############.############### + ############.############### i"; a.r; a.i
else
print using "############.############### - ############.############### i"; a.r; -a.i
end if
end sub
 
function intc( n as integer ) as complex
dim as complex c
c.r = n
c.i = 0.0
return c
end function
 
function absc( a as complex ) as double
return sqr( (a*conj(a)).r )
end function
 
'-----------------------
' the algorithm
' Uses a rapidly converging continued
' fraction expansion for e^z and recursive
' expressions for its convergents
'-----------------------
 
dim as complex pii, pii2, curr, A2, A1, A0, B2, B1, B0
dim as complex ONE, TWO
dim as integer i, k = 2
pii.r = 0.0
pii.i = PI
pii2 = pii*pii
 
B0 = intc(2)
A0 = intc(2)
B1 = (intc(2) - pii)
A1 = B0*B1 + intc(2)*pii
printc( A0/B0)
print " Absolute error = ", absc(A0/B0)
printc( A1/B1)
print " Absolute error = ", absc(A1/B1)
 
for i = 1 to MAXITER
k = k + 4
A2 = intc(k)*A1 + pii2*A0
B2 = intc(k)*B1 + pii2*B0
curr = A2/B2
A0 = A1
A1 = A2
B0 = B1
B1 = B2
printc( curr )
print " Absolute error = ", absc(curr)
next i</syntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
import (
Line 192 ⟶ 388:
func main() {
fmt.Println(cmplx.Exp(math.Pi * 1i) + 1.0)
}</langsyntaxhighlight>
 
{{output}}
Line 202 ⟶ 398:
=={{header|Groovy}}==
Because the Groovy language does not provide a built-in facility for complex arithmetic, this example relies on the Complex class defined in the [[Complex_numbers#Groovy|Complex numbers]] example.
<langsyntaxhighlight lang="groovy">import static Complex.*
 
Number.metaClass.mixin ComplexCategory
Line 211 ⟶ 407:
println "e ** (π * i) + 1 = " + (e ** (π * i) + 1)
 
println "| e ** (π * i) + 1 | = " + (e ** (π * i) + 1).ρ</langsyntaxhighlight>
Output: (yadda, yadda, dust, yadda)
<pre>e ** (π * i) + 1 = 1.2246467991473532E-16i
Line 219 ⟶ 415:
 
A double is not quite real.
<langsyntaxhighlight Haskelllang="haskell">import Data.Complex
 
eulerIdentityZeroIsh :: Complex Double
Line 226 ⟶ 422:
main :: IO ()
main = print eulerIdentityZeroIsh</langsyntaxhighlight>
{{Out}}
 
Line 233 ⟶ 429:
 
=={{header|J}}==
<syntaxhighlight lang="j">
<lang j>
NB. Euler's number is the default base for power
NB. using j's expressive numeric notation:
Line 256 ⟶ 452:
1 (=!.1e_15) ^ j. TAU
1
</syntaxhighlight>
</lang>
 
=={{header|Java}}==
Since Java lacks a complex number class, a class is used that has sufficient operations.
<syntaxhighlight lang="java">
public class EulerIdentity {
 
public static void main(String[] args) {
System.out.println("e ^ (i*Pi) + 1 = " + (new Complex(0, Math.PI).exp()).add(new Complex(1, 0)));
}
 
public static class Complex {
 
private double x, y;
public Complex(double re, double im) {
x = re;
y = im;
}
public Complex exp() {
double exp = Math.exp(x);
return new Complex(exp * Math.cos(y), exp * Math.sin(y));
}
public Complex add(Complex a) {
return new Complex(x + a.x, y + a.y);
}
@Override
public String toString() {
return x + " + " + y + "i";
}
}
}
</syntaxhighlight>
 
{{out}}
<pre>e ^ (i*Pi) + 1 = 0.0 + 1.2246467991473532E-16i
</pre>
 
=={{header|jq}}==
Line 267 ⟶ 502:
be placed in a module to avoid name conflicts, and thus no special
prefix is used here.
<langsyntaxhighlight lang="jq">def multiply(x; y):
if (x|type) == "number" then
if (y|type) == "number" then [ x*y, 0 ]
Line 293 ⟶ 528:
 
def pi: 4 * (1|atan);
</syntaxhighlight>
</lang>
 
===The Task===
<langsyntaxhighlight lang="jq">"e^iπ: \( exp( [0, pi ] ) )",
"e^iπ + 1: \( plus(1; exp( [0, pi ] ) ))"</langsyntaxhighlight>
 
{{out}}
Line 307 ⟶ 542:
Julia has a builtin <tt>Complex{T}</tt> parametrized type.
 
<langsyntaxhighlight lang="julia">@show ℯ^(π * im) + 1
@assert ℯ^(π * im) ≈ -1</langsyntaxhighlight>
 
{{out}}
Line 315 ⟶ 550:
Using symbolic algebra, through the [https://github.com/chakravala/Reduce.jl Reduce.jl] package.
 
<langsyntaxhighlight lang="julia">using Reduce
@force using Reduce.Algebra
 
@show ℯ^(π * :i) + 1
@assert ℯ^(π * :i) + 1 == 0</langsyntaxhighlight>
 
{{out}}
Line 328 ⟶ 563:
 
e ^ πi is calculated by summing successive terms of the power series for e ^ x until the modulus of the difference between terms is no longer significant given the precision of the Double type (about 10 ^ -16).
<langsyntaxhighlight lang="scala">// Version 1.2.40
 
import kotlin.math.sqrt
Line 379 ⟶ 614:
e += Complex(1.0, 0.0)
println("e^${SMALL_PI}i + 1 = $e $APPROX_EQUALS 0")
}</langsyntaxhighlight>
 
{{output}}
Line 386 ⟶ 621:
</pre>
 
=={{header|MathematicaLambdatalk}}==
<syntaxhighlight lang="scheme">
<lang Mathematica>E^(I Pi) + 1 == 0</lang>
{require lib_complex}
 
'{C.exp {C.mul {C.new 0 1} {C.new {PI} 0}}} // e^πi = exp( [π,0] * [0,1] )
-> (-1 1.2246467991473532e-16) // = -1
</syntaxhighlight>
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">local c = {
new = function(s,r,i) s.__index=s return setmetatable({r=r, i=i}, s) end,
add = function(s,o) return s:new(s.r+o.r, s.i+o.i) end,
exp = function(s) local e=math.exp(s.r) return s:new(e*math.cos(s.i), e*math.sin(s.i)) end,
mul = function(s,o) return s:new(s.r*o.r+s.i*o.i, s.r*o.i+s.i*o.r) end
}
local i = c:new(0, 1)
local pi = c:new(math.pi, 0)
local one = c:new(1, 0)
local zero = i:mul(pi):exp():add(one)
print(string.format("e^(i*pi)+1 is approximately zero: %.18g%+.18gi", zero.r, zero.i))</syntaxhighlight>
{{out}}
<pre>e^(i*pi)+1 is approximately zero: 0+1.22460635382237726e-016i</pre>
<syntaxhighlight lang="lua">> -- alternatively, equivalent one-liner from prompt:
> math.exp(0)*math.cos(math.pi)+1, math.exp(0)*math.sin(math.pi)
0.0 1.2246063538224e-016</syntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">E^(I Pi) + 1</syntaxhighlight>
{{out}}
<pre>0</pre>
 
=={{header|Maxima}}==
<syntaxhighlight lang="maxima">
is(equal(%e^(%i*%pi)+1,0));
</syntaxhighlight>
{{out}}
<pre>
true
</pre>
 
=={{header|Nim}}==
<syntaxhighlight lang="nim">import math, complex
 
echo "exp(iπ) + 1 = ", exp(complex(0.0, PI)) + 1, " ~= 0"</syntaxhighlight>
 
{{out}}
<pre>exp(iπ) + 1 = (0.0, 1.224646799147353e-16) ~= 0</pre>
<pre>True</pre>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml"># open Complex;;
# let pi = acos (-1.0);;
val pi : float = 3.14159265358979312
# add (exp { re = 0.0; im = pi }) { re = 1.0; im = 0.0 };;
- : Complex.t = {re = 0.; im = 1.22464679914735321e-16}</langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">use Math::Complex;
print exp(pi * i) + 1, "\n";</langsyntaxhighlight>
{{out}}
<pre>1.22464679914735e-16i</pre>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.03}}
Implementing an "invisible times" operator (Unicode character (U+2062)) to more closely emulate the layout. Alas, Perl 6 does not do symbolic calculations at this time and is limited to IEEE 754 floating point for transcendental and irrational number calculations.
 
e, i and π are all available as built-in constants in Perl 6.
 
<lang perl6>sub infix:<⁢> is tighter(&infix:<**>) { $^a * $^b };
 
say 'e**i⁢π + 1 ≅ 0 : ', e**i⁢π + 1 ≅ 0;
say 'Error: ', e**i⁢π + 1;</lang>
{{out}}
<pre>e**i⁢π + 1 ≅ 0 : True
Error: 0+1.2246467991473532e-16i</pre>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>include builtins\complex.e -- (0.8.0+)
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
complex res = complex_add(complex_exp(complex_mul(PI,I)),1)
<span style="color: #008080;">include</span> <span style="color: #000000;">builtins</span><span style="color: #0000FF;">\</span><span style="color: #004080;">complex</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
?complex_sprint(res,both:=true)
<span style="color: #004080;">complex</span> <span style="color: #000000;">i</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">complex_new</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">),</span>
?complex_sprint(complex_round(res,1e16),true)
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">complex_add</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">complex_exp</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">complex_mul</span><span style="color: #0000FF;">(</span><span style="color: #004600;">PI</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">)),</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)</span>
?complex_sprint(complex_round(res,1e15))</lang>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">complex_sprint</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">both</span><span style="color: #0000FF;">:=</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">complex_sprint</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">complex_round</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1e16</span><span style="color: #0000FF;">),</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #7060A8;">complex_sprint</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">complex_round</span><span style="color: #0000FF;">(</span><span style="color: #000000;">res</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1e15</span><span style="color: #0000FF;">),</span><span style="color: #004600;">true</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
The actual result and two rounded versions (to prove the rounding is doing what it should - the second arg is an inverted precision).
Line 429 ⟶ 697:
"0+1.2246e-16i"
"0+1e-16i"
"0+0i"
</pre>
{{trans|Prolog}}
Of course "symbolically" you can just do this (ha ha):
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">reduce</span><span style="color: #0000FF;">(</span><span style="color: #004080;">string</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">rules</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{{</span><span style="color: #008000;">"-1+1"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"0"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"-1+0"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"-1"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"i*0"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"0"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"sin(pi)"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"0"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"cos(pi)"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"-1"</span><span style="color: #0000FF;">},</span>
<span style="color: #0000FF;">{</span><span style="color: #008000;">"exp(i*pi)"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"cos(pi)+i*sin(pi)"</span><span style="color: #0000FF;">}}</span>
<span style="color: #004080;">string</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">s</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span> <span style="color: #000080;font-style:italic;">-- (be safe and avoid infinite loops)</span>
<span style="color: #008080;">while</span> <span style="color: #008080;">not</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- "" re-treading</span>
<span style="color: #008080;">and</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)<</span><span style="color: #000000;">10000</span> <span style="color: #008080;">do</span> <span style="color: #000080;font-style:italic;">-- "" ever-growing</span>
<span style="color: #000000;">seen</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #000000;">seen</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">bool</span> <span style="color: #000000;">found</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rules</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #004080;">string</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">rules</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
<span style="color: #008080;">if</span> <span style="color: #7060A8;">match</span><span style="color: #0000FF;">(</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">found</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">substitute</span><span style="color: #0000FF;">(</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">r</span><span style="color: #0000FF;">,</span><span style="color: #000000;">e</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">found</span> <span style="color: #008080;">then</span> <span style="color: #008080;">exit</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s = %s\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">t</span><span style="color: #0000FF;">})</span>
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">' '</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
<span style="color: #000000;">reduce</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"exp(i*pi)+1"</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
exp(i*pi)+1 = cos(pi)+i*sin(pi)+1
= -1+i*0+1
= -1+0+1
= -1+1
= 0
</pre>
 
=={{header|Prolog}}==
Symbolically manipulates Euler's identity until it can't be further reduced (and we get zero :)
<syntaxhighlight lang="prolog">
% reduce() prints the intermediate results so that one can see Prolog "thinking."
%
reduce(A, C) :-
simplify(A, B),
(B = A -> C = A; io:format("= ~w~n", [B]), reduce(B, C)).
 
simplify(exp(i*X), cos(X) + i*sin(X)) :- !.
 
simplify(0 + A, A) :- !.
simplify(A + 0, A) :- !.
simplify(A + B, C) :-
integer(A),
integer(B), !,
C is A + B.
simplify(A + B, C + D) :- !,
simplify(A, C),
simplify(B, D).
 
simplify(0 * _, 0) :- !.
simplify(_ * 0, 0) :- !.
simplify(1 * A, A) :- !.
simplify(A * 1, A) :- !.
simplify(A * B, C) :-
integer(A),
integer(B), !,
C is A * B.
simplify(A * B, C * D) :- !,
simplify(A, C),
simplify(B, D).
 
simplify(cos(0), 1) :- !.
simplify(sin(0), 0) :- !.
simplify(cos(pi), -1) :- !.
simplify(sin(pi), 0) :- !.
 
simplify(X, X).
</syntaxhighlight>
{{Out}}
<pre>
?- reduce(exp(i*pi)+1, X).
= cos(pi)+i*sin(pi)+1
= -1+i*0+1
= -1+0+1
= -1+1
= 0
X = 0.
</pre>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">>>> import math
>>> math.e ** (math.pi * 1j) + 1
1.2246467991473532e-16j</langsyntaxhighlight>
 
=={{header|R}}==
<syntaxhighlight lang="r"># lang R
exp(1i * pi) + 1</syntaxhighlight>
{{out}}<pre>0+1.224606e-16i</pre>
 
Symbolically with the Ryacas package (on CRAN):
<syntaxhighlight lang="r">library(Ryacas)
as_r(yac_str("Exp(I * Pi) + 1"))</syntaxhighlight>
{{out}}<pre>0</pre>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">#lang racket
(+ (exp (* 0+i pi)) 1)</langsyntaxhighlight>
{{out}}<pre>0.0+1.2246063538223773e-016i</pre>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.03}}
Implementing an "invisible times" operator (Unicode character (U+2062)) to more closely emulate the layout. Alas, Raku does not do symbolic calculations at this time and is limited to IEEE 754 floating point for transcendental and irrational number calculations.
 
e, i and π are all available as built-in constants in Raku.
 
<syntaxhighlight lang="raku" line>sub infix:<⁢> is tighter(&infix:<**>) { $^a * $^b };
 
say 'e**i⁢π + 1 ≅ 0 : ', e**i⁢π + 1 ≅ 0;
say 'Error: ', e**i⁢π + 1;</syntaxhighlight>
{{out}}
<pre>e**i⁢π + 1 ≅ 0 : True
Error: 0+1.2246467991473532e-16i</pre>
 
=={{header|REXX}}==
Line 478 ⟶ 862:
of &nbsp; pi &nbsp; being defined within the REXX
<br>program.
<langsyntaxhighlight lang="rexx">/*REXX program proves Euler's identity by showing that: e^(i pi) + 1 ≡ 0 */
numeric digits length( pi() ) - 1length(.) /*define pi; /*set number# of decimaldec. digs precision.*/
cosPi cosPI= fmt( cos( pi() ) ) /*calculate the value of cos(pi). */
sinPi sinPI= fmt( sin( pi() ) ) /* " " " " sin(pi). */
say ' cos(pi) = ' cosPi cosPI /*display " " " cos(Pi). */
say ' sin(pi) = ' sinPi sinPI /* " " " " sin(Pi). */
say /*separate the wheat from the chaff. */
$= cosPicosPI + mult( sqrt(-1), sinPisinPI ) + 1 /*calc. product of sin(x) and sqrt(-1).*/
say ' e^(i pi) + 1 = ' fmt($) ' proof($ = 0) ' /*displayword("unproven bothproven", sides of($=0) the equation.+ */1)
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
fmt: procedure; parse arg x; x= format(x, , digits() %2, 0); return left('', x>=0)x / 1
mult: procedure; parse arg a,b; if a=0 | b=0 then return 0; return a*b
pi: pi= 3.1415926535897932384626433832795028841971693993751058209749445923; return pi
proofcos: procedure; parse arg ?x; z= 1; _= 1; returnq= 'x*x; 'i= -1; word("unproven proven", ? + 1 return .sinCos()
cossin: procedure; parse arg x; 1 z 1 _; q= x*x; i= 1; return .sinCos(1, -1)
sin.sinCos: procedure; parse arg x; do k=2 by 2 until p=z; p=z; _= -_ * q/(k*(k+i)); z= z+_; end; return .sinCos(x, 1)z
/*──────────────────────────────────────────────────────────────────────────────────────*/
.sinCossqrt: procedure; parse arg z 1 _,i; q=x*x; if do kx=20 bythen 2return 0; until pd=zdigits(); pi=z; _=-_*q/(k*(k+i)); z h=z d+_6
numeric digits; numeric form; if x<0 then do; x= -x; i= 'i'; end /*k*'; m.= return z9
/*──────────────────────────────────────────────────────────────────────────────────────*/
sqrt: procedure; parse arg x; if x=0 then return 0; d=digits(); i=; m.=9; h=d+6
numeric digits; numeric form; if x<0 then do; x= -x; i= 'i'; end
parse value format(x, 2, 1, , 0) 'E0' with g 'E' _ .; g= g * .5'e'_ % 2
do j=0 while h>9; m.j= h; h= h % 2 + 1; end /*j*/
do k=j+5 to 0 by -1; numeric digits m.k; g= (g+x/g) * .5; end; return g || i</*k*/syntaxhighlight>
{{out|output|text=&nbsp; when using the internal default input:}}
numeric digits d; return (g/1)i /*make complex if X < 0.*/</lang>
{{out|output}}
<pre>
cos(pi) = -1
sin(pi) = 0
 
e^(i pi) + 1 = 0 proven
</pre>
 
Line 520 ⟶ 900:
<br>programmatically invoked with the requested number of decimal digits).
 
<langsyntaxhighlight lang="rexx">/*────────────────── 1,051 decimal digs of pi. ──────────────────*/
 
pi= 3.14159265358979323846264338327950288419716939937510
Line 542 ⟶ 922:
pi= pi || 59825349042875546873115956286388235378759375195778
pi= pi || 18577805321712268066130019278766111959092164201989
pi= pi || 38095257201065485863278865936153381827968230301952 </langsyntaxhighlight>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
'EXP(i*π)+1' →NUM ABS
{{out}}
<pre>
1.22464679915E-16
</pre>
 
=={{header|Ruby}}==
<syntaxhighlight lang ="ruby">> require 'complex'
include Math
> Math::E ** (Math::PI * Complex::I) + 1
 
=> (0.0+0.0i)</lang>
E ** (PI * 1i) + 1
# => (0.0+0.0i)</syntaxhighlight>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">use std::f64::consts::PI;
 
extern crate num_complex;
Line 557 ⟶ 947:
fn main() {
println!("{:e}", Complex::new(0.0, PI).exp() + 1.0);
}</langsyntaxhighlight>
 
{{output}}
Line 567 ⟶ 957:
This example makes use of Spire's numeric data types. Complex takes a type parameter determining the type of the coefficients of a + bi, and Real is Spire's exact (i.e. arbitrary precision) numeric data type.
 
<langsyntaxhighlight lang="scala">import spire.math.{Complex, Real}
 
object Scratch extends App{
Line 577 ⟶ 967:
println(e.pow(pi*i) + one)
}</langsyntaxhighlight>
 
{{output}}
Line 583 ⟶ 973:
(0 + 0i)
</pre>
=={{header|Scheme}}==
{{works with|Chez Scheme}}
<syntaxhighlight lang="scheme">; A way to get pi.
(define pi (acos -1))
 
; Print the value of e^(i*pi) + 1 -- should be 0.
(printf "e^(i*pi) + 1 = ~a~%" (+ (exp (* +i pi)) 1))</syntaxhighlight>
{{out}}
<pre>e^(i*pi) + 1 = 0.0+1.2246467991473532e-16i
</pre>
{{works with|Chez Scheme}}
A higher precision test using series approximations to Pi and the Exp() function.
The series are computed using exact rational numbers.
This code converts the rational results into decimal representation.
<syntaxhighlight lang="scheme">; Procedure to compute factorial.
 
(define fact
(lambda (n)
(if (<= n 0)
1
(* n (fact (1- n))))))
 
; Use series to compute approximation to Pi (using N terms of series).
; (Uses the Newton / Euler Convergence Transformation.)
 
(define pi-series
(lambda (n)
(do ((k 0 (1+ k))
(sum 0 (+ sum (/ (* (expt 2 k) (expt (fact k) 2)) (fact (1+ (* 2 k)))))))
((>= k n) (* 2 sum)))))
 
; Use series to compute approximation to exp(z) (using N terms of series).
 
(define exp-series
(lambda (z n)
(do ((k 0 (1+ k))
(sum 0 (+ sum (/ (expt z k) (fact k)))))
((>= k n) sum))))
 
; Convert the given Rational number to a Decimal string.
; If opt contains an integer, show to that many places past the decimal regardless of repeating.
; If opt contains 'nopar, do not insert the parentheses indicating the repeating places.
; If opt contains 'plus, prefix positive numbers with plus ('+') sign.
; N.B.: When number of decimals specified, this truncates instead of rounds.
 
(define rat->dec-str
(lambda (rat . opt)
(let* ((num (abs (numerator rat)))
(den (abs (denominator rat)))
(no-par (find (lambda (a) (eq? a 'nopar)) opt))
(plus (find (lambda (a) (eq? a 'plus)) opt))
(dec-lim (find integer? opt))
(rep-inx #f)
(rems-seen '())
(int-part (format (cond ((< rat 0) "-~d") (plus "+~d") (else "~d")) (quotient num den)))
(frc-list
(cond
((zero? num)
'())
(else
(let loop ((rem (modulo num den)) (decs 0))
(cond
((or (<= rem 0) (and dec-lim (>= decs dec-lim)))
'())
((and (not dec-lim) (assq rem rems-seen))
(set! rep-inx (cdr (assq rem rems-seen)))
'())
(else
(set! rems-seen (cons (cons rem decs) rems-seen))
(cons
(integer->char (+ (quotient (* 10 rem) den) (char->integer #\0)))
(loop (modulo (* 10 rem) den) (1+ decs))))))))))
(when (and rep-inx (not no-par))
(set! frc-list (append
(list-head frc-list rep-inx)
(list #\()
(list-tail frc-list rep-inx)
(list #\)))))
(if (null? frc-list)
int-part
(format "~a.~a" int-part (list->string frc-list))))))
 
; Convert the given Rational Complex number to a Decimal string.
; If opt contains an integer, show to that many places past the decimal regardless of repeating.
; If opt contains 'nopar, do not insert the parentheses indicating the repeating places.
; If opt contains 'plus, prefix positive numbers with plus ('+') sign.
; N.B.: When number of decimals specified, this truncates instead of rounds.
 
(define rat-cplx->dec-str
(lambda (rat-cplx . opt)
(let* ((real-dec-str (apply rat->dec-str (cons (real-part rat-cplx) opt)))
(imag-dec-str (apply rat->dec-str (cons (imag-part rat-cplx) (cons 'plus opt)))))
(format "~a~ai" real-dec-str imag-dec-str))))
 
; Print the value of e^(i*pi) + 1 -- should be 0.
; (Computed using the series defined above.)
 
(let*
((pi (pi-series 222))
(e-pi-i (exp-series (* pi +i) 222))
(euler-id (+ e-pi-i 1)))
(printf "e^(i*pi) + 1 = ~a~%" (rat-cplx->dec-str euler-id 70)))</syntaxhighlight>
{{out}}
<pre>e^(i*pi) + 1 =
0.0000000000000000000000000000000000000000000000000000000000000000000000
+0.0000000000000000000000000000000000000000000000000000000000000000000351i</pre>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">say ('e**i⁢π + 1 ≅ 0 : ', Num.e**Num.pi.i + 1 ≅ 0)
say ('Error: ', Num.e**Num.pi.i + 1)</langsyntaxhighlight>
{{out}}
<pre>
Line 595 ⟶ 1,091:
=={{header|Tcl}}==
=== Using tcllib ===
<langsyntaxhighlight lang="tcl"># Set up complex sandbox (since we're doing a star import)
namespace eval complex_ns {
package require math::complexnumbers
Line 604 ⟶ 1,100:
set r [+ [exp [complex 0 $pi]] [complex 1 0]]
puts "e**(pi*i) = [real $r]+[imag $r]i"
}</langsyntaxhighlight>
{{out}}
<pre>
Line 611 ⟶ 1,107:
 
=== Using VecTcl ===
<langsyntaxhighlight lang="tcl">package require vectcl
namespace import vectcl::vexpr
 
set ans [vexpr {pi=acos(-1); exp(pi*1i) + 1}]
puts "e**(pi*i) = $ans"
</syntaxhighlight>
</lang>
{{out}}
<pre>
e**(pi*i) = 0.0+1.2246063538223773e-16i
</pre>
 
=={{header|Wren}}==
{{libheader|Wren-complex}}
 
<syntaxhighlight lang="wren">import "./complex" for Complex
 
System.print((Complex.new(0, Num.pi).exp + Complex.one).toString)</syntaxhighlight>
 
{{out}}
<pre>
0 + 1.2246467991474e-16i
</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">var [const] GSL=Import("zklGSL"); // libGSL (GNU Scientific Library)
Z,pi,e := GSL.Z, (0.0).pi, (0.0).e;
 
println("e^(\u03c0i) + 1 = %s \u2245 0".fmt( Z(e).pow(Z(0,1)*pi) + 1 ));
println("TMI: ",(Z(e).pow(Z(0,1)*pi) + 1 ).format(0,25,"g"));</langsyntaxhighlight>
{{out}}
<pre>
9,476

edits