trackler 2.2.1.85 → 2.2.1.86
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/alphametics/canonical-data.json +29 -11
- data/problem-specifications/exercises/binary-search-tree/canonical-data.json +177 -0
- data/problem-specifications/package.json +2 -2
- data/problem-specifications/yarn.lock +61 -51
- data/tracks/bash/CONTRIBUTING.md +10 -6
- data/tracks/bash/README.md +1 -0
- data/tracks/bash/exercises/acronym/README.md +1 -1
- data/tracks/bash/exercises/anagram/README.md +1 -1
- data/tracks/bash/exercises/anagram/{anagram_tests.sh → anagram_test.sh} +0 -0
- data/tracks/bash/exercises/armstrong-numbers/armstrong_numbers_test.sh +25 -17
- data/tracks/bash/exercises/armstrong-numbers/example.sh +18 -12
- data/tracks/bash/exercises/atbash-cipher/README.md +1 -1
- data/tracks/bash/exercises/atbash-cipher/{atbash_cipher_tests.sh → atbash_cipher_test.sh} +0 -0
- data/tracks/bash/exercises/difference-of-squares/README.md +1 -1
- data/tracks/bash/exercises/gigasecond/README.md +1 -1
- data/tracks/bash/exercises/hamming/README.md +1 -1
- data/tracks/bash/exercises/hello-world/README.md +1 -1
- data/tracks/bash/exercises/leap/README.md +1 -1
- data/tracks/bash/exercises/luhn/README.md +1 -1
- data/tracks/bash/exercises/nucleotide-count/README.md +1 -1
- data/tracks/bash/exercises/pangram/README.md +1 -1
- data/tracks/bash/exercises/pangram/{pangram_tests.sh → pangram_test.sh} +0 -0
- data/tracks/bash/exercises/phone-number/README.md +1 -1
- data/tracks/bash/exercises/phone-number/{phone_number_tests.sh → phone_number_test.sh} +0 -0
- data/tracks/bash/exercises/raindrops/README.md +1 -1
- data/tracks/bash/exercises/rna-transcription/README.md +1 -1
- data/tracks/bash/exercises/triangle/example.sh +23 -4
- data/tracks/bash/exercises/triangle/triangle_test.sh +17 -0
- data/tracks/bash/exercises/two-fer/README.md +1 -1
- data/tracks/bash/exercises/word-count/README.md +1 -1
- data/tracks/c/config.json +11 -0
- data/tracks/c/exercises/complex-numbers/README.md +67 -0
- data/tracks/c/exercises/complex-numbers/makefile +27 -0
- data/tracks/c/exercises/complex-numbers/src/complex_numbers.c +46 -0
- data/tracks/c/exercises/complex-numbers/src/complex_numbers.h +19 -0
- data/tracks/c/exercises/complex-numbers/src/example.c +80 -0
- data/tracks/c/exercises/complex-numbers/test/test_complex_numbers.c +397 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/complex-numbers/test/vendor/unity_internals.h +701 -0
- data/tracks/crystal/.github/stale.yml +18 -0
- data/tracks/csharp/exercises/bob/README.md +3 -2
- data/tracks/ecmascript/config.json +4 -4
- data/tracks/fsharp/exercises/bob/README.md +4 -2
- data/tracks/fsharp/exercises/react/ReactTest.fs +137 -74
- data/tracks/fsharp/generators/Generators.fs +76 -0
- data/tracks/go/exercises/tree-building/tree_test.go +15 -0
- data/tracks/haskell/.travis.yml +1 -1
- data/tracks/haskell/exercises/accumulate/stack.yaml +1 -1
- data/tracks/haskell/exercises/acronym/package.yaml +1 -1
- data/tracks/haskell/exercises/acronym/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/stack.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +6 -6
- data/tracks/haskell/exercises/allergies/package.yaml +1 -1
- data/tracks/haskell/exercises/allergies/stack.yaml +1 -1
- data/tracks/haskell/exercises/alphametics/stack.yaml +1 -1
- data/tracks/haskell/exercises/anagram/package.yaml +1 -1
- data/tracks/haskell/exercises/anagram/stack.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/atbash-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/bank-account/stack.yaml +1 -1
- data/tracks/haskell/exercises/beer-song/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/package.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/stack.yaml +1 -1
- data/tracks/haskell/exercises/binary-search-tree/test/Tests.hs +3 -0
- data/tracks/haskell/exercises/binary/stack.yaml +1 -1
- data/tracks/haskell/exercises/bob/package.yaml +1 -1
- data/tracks/haskell/exercises/bob/stack.yaml +1 -1
- data/tracks/haskell/exercises/bowling/stack.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/package.yaml +1 -1
- data/tracks/haskell/exercises/bracket-push/stack.yaml +1 -1
- data/tracks/haskell/exercises/change/package.yaml +1 -1
- data/tracks/haskell/exercises/change/stack.yaml +1 -1
- data/tracks/haskell/exercises/clock/stack.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/package.yaml +1 -1
- data/tracks/haskell/exercises/collatz-conjecture/stack.yaml +1 -1
- data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/connect/package.yaml +1 -1
- data/tracks/haskell/exercises/connect/stack.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/stack.yaml +1 -1
- data/tracks/haskell/exercises/custom-set/stack.yaml +1 -1
- data/tracks/haskell/exercises/diamond/package.yaml +1 -1
- data/tracks/haskell/exercises/diamond/stack.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/package.yaml +1 -1
- data/tracks/haskell/exercises/difference-of-squares/stack.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
- data/tracks/haskell/exercises/dominoes/stack.yaml +1 -1
- data/tracks/haskell/exercises/etl/stack.yaml +1 -1
- data/tracks/haskell/exercises/food-chain/stack.yaml +1 -1
- data/tracks/haskell/exercises/forth/stack.yaml +1 -1
- data/tracks/haskell/exercises/gigasecond/stack.yaml +1 -1
- data/tracks/haskell/exercises/go-counting/stack.yaml +1 -1
- data/tracks/haskell/exercises/grade-school/stack.yaml +1 -1
- data/tracks/haskell/exercises/grains/stack.yaml +1 -1
- data/tracks/haskell/exercises/hamming/stack.yaml +1 -1
- data/tracks/haskell/exercises/hello-world/stack.yaml +1 -1
- data/tracks/haskell/exercises/hexadecimal/stack.yaml +1 -1
- data/tracks/haskell/exercises/house/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/examples/success-standard/src/IsbnVerifier.hs +1 -0
- data/tracks/haskell/exercises/isbn-verifier/package.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/stack.yaml +1 -1
- data/tracks/haskell/exercises/isbn-verifier/test/Tests.hs +4 -0
- data/tracks/haskell/exercises/isogram/stack.yaml +1 -1
- data/tracks/haskell/exercises/kindergarten-garden/stack.yaml +1 -1
- data/tracks/haskell/exercises/largest-series-product/stack.yaml +1 -1
- data/tracks/haskell/exercises/leap/stack.yaml +1 -1
- data/tracks/haskell/exercises/lens-person/stack.yaml +1 -1
- data/tracks/haskell/exercises/linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/package.yaml +1 -1
- data/tracks/haskell/exercises/luhn/stack.yaml +1 -1
- data/tracks/haskell/exercises/luhn/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/meetup/package.yaml +1 -1
- data/tracks/haskell/exercises/meetup/stack.yaml +1 -1
- data/tracks/haskell/exercises/minesweeper/stack.yaml +1 -1
- data/tracks/haskell/exercises/nth-prime/stack.yaml +1 -1
- data/tracks/haskell/exercises/nucleotide-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/ocr-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/octal/stack.yaml +1 -1
- data/tracks/haskell/exercises/palindrome-products/stack.yaml +1 -1
- data/tracks/haskell/exercises/pangram/stack.yaml +1 -1
- data/tracks/haskell/exercises/parallel-letter-frequency/stack.yaml +1 -1
- data/tracks/haskell/exercises/pascals-triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/perfect-numbers/stack.yaml +1 -1
- data/tracks/haskell/exercises/phone-number/stack.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/stack.yaml +1 -1
- data/tracks/haskell/exercises/pov/stack.yaml +1 -1
- data/tracks/haskell/exercises/prime-factors/stack.yaml +1 -1
- data/tracks/haskell/exercises/pythagorean-triplet/stack.yaml +1 -1
- data/tracks/haskell/exercises/queen-attack/stack.yaml +1 -1
- data/tracks/haskell/exercises/rail-fence-cipher/package.yaml +1 -1
- data/tracks/haskell/exercises/rail-fence-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/raindrops/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/stack.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +0 -12
- data/tracks/haskell/exercises/robot-name/stack.yaml +1 -1
- data/tracks/haskell/exercises/robot-simulator/stack.yaml +1 -1
- data/tracks/haskell/exercises/roman-numerals/stack.yaml +1 -1
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/run-length-encoding/stack.yaml +1 -1
- data/tracks/haskell/exercises/saddle-points/stack.yaml +1 -1
- data/tracks/haskell/exercises/say/stack.yaml +1 -1
- data/tracks/haskell/exercises/scrabble-score/stack.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/stack.yaml +1 -1
- data/tracks/haskell/exercises/series/stack.yaml +1 -1
- data/tracks/haskell/exercises/sgf-parsing/stack.yaml +1 -1
- data/tracks/haskell/exercises/sieve/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-cipher/stack.yaml +1 -1
- data/tracks/haskell/exercises/simple-linked-list/stack.yaml +1 -1
- data/tracks/haskell/exercises/space-age/stack.yaml +1 -1
- data/tracks/haskell/exercises/spiral-matrix/stack.yaml +1 -1
- data/tracks/haskell/exercises/strain/stack.yaml +1 -1
- data/tracks/haskell/exercises/sublist/stack.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/stack.yaml +1 -1
- data/tracks/haskell/exercises/triangle/stack.yaml +1 -1
- data/tracks/haskell/exercises/trinary/stack.yaml +1 -1
- data/tracks/haskell/exercises/twelve-days/stack.yaml +1 -1
- data/tracks/haskell/exercises/word-count/stack.yaml +1 -1
- data/tracks/haskell/exercises/wordy/stack.yaml +1 -1
- data/tracks/haskell/exercises/zebra-puzzle/stack.yaml +1 -1
- data/tracks/haskell/exercises/zipper/stack.yaml +1 -1
- data/tracks/java/config.json +12 -0
- data/tracks/java/exercises/alphametics/.meta/src/reference/java/Alphametics.java +125 -0
- data/tracks/java/exercises/alphametics/.meta/src/reference/java/UnsolvablePuzzleException.java +2 -0
- data/tracks/java/exercises/alphametics/.meta/src/version +1 -0
- data/tracks/java/exercises/alphametics/README.md +47 -0
- data/tracks/java/exercises/alphametics/build.gradle +18 -0
- data/tracks/java/exercises/alphametics/src/main/java/.keep +0 -0
- data/tracks/java/exercises/alphametics/src/main/java/UnsolvablePuzzleException.java +2 -0
- data/tracks/java/exercises/alphametics/src/test/java/AlphameticsTest.java +150 -0
- data/tracks/java/exercises/beer-song/.meta/src/reference/java/BeerSong.java +5 -4
- data/tracks/java/exercises/beer-song/.meta/version +1 -0
- data/tracks/java/exercises/beer-song/src/test/java/BeerSongTest.java +24 -16
- data/tracks/java/exercises/binary-search/.meta/version +1 -0
- data/tracks/java/exercises/book-store/.meta/version +1 -0
- data/tracks/java/exercises/book-store/src/test/java/BookStoreTest.java +15 -8
- data/tracks/java/exercises/circular-buffer/.meta/version +1 -0
- data/tracks/java/exercises/list-ops/.meta/version +1 -1
- data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +1 -1
- data/tracks/java/exercises/nth-prime/.meta/version +1 -0
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/java/exercises/tournament/.meta/version +1 -0
- data/tracks/java/exercises/transpose/.meta/version +1 -0
- data/tracks/java/exercises/transpose/src/test/java/TransposeTest.java +29 -74
- data/tracks/java/exercises/wordy/.meta/version +1 -0
- data/tracks/javascript/.eslintignore +0 -1
- data/tracks/javascript/config.json +13 -3
- data/tracks/javascript/exercises/bowling/example.js +24 -10
- data/tracks/javascript/exercises/forth/README.md +56 -0
- data/tracks/javascript/exercises/forth/example.js +66 -0
- data/tracks/javascript/exercises/forth/forth.spec.js +259 -0
- data/tracks/lua/config.json +92 -81
- data/tracks/lua/exercises/accumulate/README.md +42 -0
- data/tracks/lua/exercises/beer-song/README.md +1 -1
- data/tracks/lua/exercises/bob/README.md +2 -0
- data/tracks/lua/exercises/crypto-square/README.md +6 -4
- data/tracks/lua/exercises/house/README.md +1 -1
- data/tracks/lua/exercises/isbn-verifier/README.md +25 -20
- data/tracks/lua/exercises/kindergarten-garden/README.md +3 -3
- data/tracks/lua/exercises/meetup/README.md +16 -12
- data/tracks/lua/exercises/nucleotide-count/README.md +2 -2
- data/tracks/lua/exercises/phone-number/README.md +1 -1
- data/tracks/lua/exercises/pov/README.md +0 -2
- data/tracks/lua/exercises/queen-attack/README.md +22 -22
- data/tracks/lua/exercises/rectangles/README.md +9 -9
- data/tracks/lua/exercises/reverse-string/README.md +23 -0
- data/tracks/lua/exercises/reverse-string/example.lua +7 -0
- data/tracks/lua/exercises/reverse-string/reverse-string_spec.lua +24 -0
- data/tracks/lua/exercises/secret-handshake/README.md +1 -1
- data/tracks/lua/exercises/space-age/README.md +1 -2
- data/tracks/lua/exercises/sum-of-multiples/README.md +3 -3
- data/tracks/perl6/exercises/two-fer/README.md +1 -1
- data/tracks/python/exercises/luhn/luhn_test.py +1 -1
- metadata +39 -6
data/tracks/c/config.json
CHANGED
@@ -477,6 +477,17 @@
|
|
477
477
|
"enums"
|
478
478
|
],
|
479
479
|
"uuid": "b0a152e9-5a45-41f9-bda0-427111d9a56c"
|
480
|
+
},
|
481
|
+
{
|
482
|
+
"core": false,
|
483
|
+
"difficulty": 2,
|
484
|
+
"slug": "complex-numbers",
|
485
|
+
"topics": [
|
486
|
+
"structs",
|
487
|
+
"performance_optimizations"
|
488
|
+
],
|
489
|
+
"unlocked_by": "difference-of-squares",
|
490
|
+
"uuid": "472b1a6b-2b7a-4609-a97d-4c2b6c941a1f"
|
480
491
|
}
|
481
492
|
],
|
482
493
|
"foregone": [],
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# Complex Numbers
|
2
|
+
|
3
|
+
A complex number is a number in the form `a + b * i` where `a` and `b` are real and `i` satisfies `i^2 = -1`.
|
4
|
+
|
5
|
+
`a` is called the real part and `b` is called the imaginary part of `z`.
|
6
|
+
The conjugate of the number `a + b * i` is the number `a - b * i`.
|
7
|
+
The absolute value of a complex number `z = a + b * i` is a real number `|z| = sqrt(a^2 + b^2)`. The square of the absolute value `|z|^2` is the result of multiplication of `z` by its complex conjugate.
|
8
|
+
|
9
|
+
The sum/difference of two complex numbers involves adding/subtracting their real and imaginary parts separately:
|
10
|
+
`(a + i * b) + (c + i * d) = (a + c) + (b + d) * i`,
|
11
|
+
`(a + i * b) - (c + i * d) = (a - c) + (b - d) * i`.
|
12
|
+
|
13
|
+
Multiplication result is by definition
|
14
|
+
`(a + i * b) * (c + i * d) = (a * c - b * d) + (b * c + a * d) * i`.
|
15
|
+
|
16
|
+
The reciprocal of a non-zero complex number is
|
17
|
+
`1 / (a + i * b) = a/(a^2 + b^2) - b/(a^2 + b^2) * i`.
|
18
|
+
|
19
|
+
Dividing a complex number `a + i * b` by another `c + i * d` gives:
|
20
|
+
`(a + i * b) / (c + i * d) = (a * c + b * d)/(c^2 + d^2) + (b * c - a * d)/(c^2 + d^2) * i`.
|
21
|
+
|
22
|
+
Exponent of a complex number can be expressed as
|
23
|
+
`exp(a + i * b) = exp(a) * exp(i * b)`,
|
24
|
+
and the last term is given by Euler's formula `exp(i * b) = cos(b) + i * sin(b)`.
|
25
|
+
|
26
|
+
|
27
|
+
Implement the following operations:
|
28
|
+
- addition, subtraction, multiplication and division of two complex numbers,
|
29
|
+
- conjugate, absolute value, exponent of a given complex number.
|
30
|
+
|
31
|
+
|
32
|
+
Assume the programming language you are using does not have an implementation of complex numbers.
|
33
|
+
|
34
|
+
|
35
|
+
## Getting Started
|
36
|
+
|
37
|
+
For installation and learning resources, refer to the
|
38
|
+
[exercism help page](http://exercism.io/languages/c).
|
39
|
+
|
40
|
+
## Running the tests
|
41
|
+
|
42
|
+
To run the test suite, execute the following command:
|
43
|
+
|
44
|
+
```bash
|
45
|
+
make test
|
46
|
+
```
|
47
|
+
|
48
|
+
To check for memory leaks using [Valgrind](http://valgrind.org/), execute the following command:
|
49
|
+
```bash
|
50
|
+
make memcheck
|
51
|
+
```
|
52
|
+
You will need Valgrind to do this. See your distribution documentation for how to install Valgrind.
|
53
|
+
|
54
|
+
## Feedback, Issues, Pull Requests
|
55
|
+
|
56
|
+
The [exercism/c](https://github.com/exercism/c) repository on
|
57
|
+
GitHub is the home for all of the C exercises.
|
58
|
+
|
59
|
+
If you have feedback about an exercise, or want to help implementing a new
|
60
|
+
one, head over there and create an issue. We'll do our best to help you!
|
61
|
+
|
62
|
+
## Source
|
63
|
+
|
64
|
+
Wikipedia [https://en.wikipedia.org/wiki/Complex_number](https://en.wikipedia.org/wiki/Complex_number)
|
65
|
+
|
66
|
+
## Submitting Incomplete Solutions
|
67
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
CFLAGS = -std=c99
|
2
|
+
CFLAGS += -g
|
3
|
+
CFLAGS += -Wall
|
4
|
+
CFLAGS += -Wextra
|
5
|
+
CFLAGS += -pedantic
|
6
|
+
CFLAGS += -Werror
|
7
|
+
|
8
|
+
VFLAGS = --quiet
|
9
|
+
VFLAGS += --tool=memcheck
|
10
|
+
VFLAGS += --leak-check=full
|
11
|
+
VFLAGS += --error-exitcode=1
|
12
|
+
|
13
|
+
LDFLAGS = -lm
|
14
|
+
|
15
|
+
test: tests.out
|
16
|
+
@./tests.out
|
17
|
+
|
18
|
+
memcheck: tests.out
|
19
|
+
@valgrind $(VFLAGS) ./tests.out
|
20
|
+
@echo "Memory check passed"
|
21
|
+
|
22
|
+
clean:
|
23
|
+
rm -rf *.o *.out *.out.dSYM
|
24
|
+
|
25
|
+
tests.out: test/test_complex_numbers.c src/complex_numbers.c src/complex_numbers.h
|
26
|
+
@echo Compiling $@
|
27
|
+
@cc $(CFLAGS) src/complex_numbers.c test/vendor/unity.c test/test_complex_numbers.c $(LDFLAGS) -o tests.out
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#include "complex_numbers.h"
|
2
|
+
|
3
|
+
complex_t c_add(complex_t a, complex_t b)
|
4
|
+
{
|
5
|
+
// TODO: implement
|
6
|
+
}
|
7
|
+
|
8
|
+
complex_t c_sub(complex_t a, complex_t b)
|
9
|
+
{
|
10
|
+
// TODO: implement
|
11
|
+
}
|
12
|
+
|
13
|
+
complex_t c_mul(complex_t a, complex_t b)
|
14
|
+
{
|
15
|
+
// TODO: implement
|
16
|
+
}
|
17
|
+
|
18
|
+
complex_t c_div(complex_t a, complex_t b)
|
19
|
+
{
|
20
|
+
// TODO: implement
|
21
|
+
}
|
22
|
+
|
23
|
+
double c_abs(complex_t x)
|
24
|
+
{
|
25
|
+
// TODO: implement
|
26
|
+
}
|
27
|
+
|
28
|
+
complex_t c_conjugate(complex_t x)
|
29
|
+
{
|
30
|
+
// TODO: implement
|
31
|
+
}
|
32
|
+
|
33
|
+
double c_real(complex_t x)
|
34
|
+
{
|
35
|
+
// TODO: implement
|
36
|
+
}
|
37
|
+
|
38
|
+
double c_imag(complex_t x)
|
39
|
+
{
|
40
|
+
// TODO: implement
|
41
|
+
}
|
42
|
+
|
43
|
+
complex_t c_exp(complex_t x)
|
44
|
+
{
|
45
|
+
// TODO: implement
|
46
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
#ifndef _COMPLEX_NUMBERS_H_
|
2
|
+
#define _COMPLEX_NUMBERS_H_
|
3
|
+
|
4
|
+
typedef struct {
|
5
|
+
double real;
|
6
|
+
double imag;
|
7
|
+
} complex_t;
|
8
|
+
|
9
|
+
complex_t c_add(complex_t a, complex_t b);
|
10
|
+
complex_t c_sub(complex_t a, complex_t b);
|
11
|
+
complex_t c_mul(complex_t a, complex_t b);
|
12
|
+
complex_t c_div(complex_t a, complex_t b);
|
13
|
+
double c_abs(complex_t x);
|
14
|
+
complex_t c_conjugate(complex_t x);
|
15
|
+
double c_real(complex_t x);
|
16
|
+
double c_imag(complex_t x);
|
17
|
+
complex_t c_exp(complex_t x);
|
18
|
+
|
19
|
+
#endif
|
@@ -0,0 +1,80 @@
|
|
1
|
+
#include "complex_numbers.h"
|
2
|
+
#include <math.h>
|
3
|
+
|
4
|
+
static double square(double x)
|
5
|
+
{
|
6
|
+
return x * x;
|
7
|
+
}
|
8
|
+
|
9
|
+
complex_t c_add(const complex_t a, const complex_t b)
|
10
|
+
{
|
11
|
+
complex_t result;
|
12
|
+
result.real = a.real + b.real;
|
13
|
+
result.imag = a.imag + b.imag;
|
14
|
+
|
15
|
+
return result;
|
16
|
+
}
|
17
|
+
|
18
|
+
complex_t c_sub(const complex_t a, const complex_t b)
|
19
|
+
{
|
20
|
+
complex_t result;
|
21
|
+
result.real = a.real - b.real;
|
22
|
+
result.imag = a.imag - b.imag;
|
23
|
+
|
24
|
+
return result;
|
25
|
+
}
|
26
|
+
|
27
|
+
complex_t c_mul(const complex_t a, const complex_t b)
|
28
|
+
{
|
29
|
+
complex_t result;
|
30
|
+
result.real = a.real * b.real - a.imag * b.imag;
|
31
|
+
result.imag = a.imag * b.real + a.real * b.imag;
|
32
|
+
|
33
|
+
return result;
|
34
|
+
}
|
35
|
+
|
36
|
+
complex_t c_div(const complex_t a, const complex_t b)
|
37
|
+
{
|
38
|
+
double denominator = square(b.real) + square(b.imag);
|
39
|
+
|
40
|
+
complex_t result;
|
41
|
+
result.real = (a.real * b.imag + a.imag * b.real) / denominator;
|
42
|
+
result.imag = (a.imag * b.real - a.real * b.imag) / denominator;
|
43
|
+
|
44
|
+
return result;
|
45
|
+
}
|
46
|
+
|
47
|
+
double c_abs(const complex_t x)
|
48
|
+
{
|
49
|
+
return sqrt(square(x.real) + square(x.imag));
|
50
|
+
}
|
51
|
+
|
52
|
+
complex_t c_conjugate(const complex_t x)
|
53
|
+
{
|
54
|
+
complex_t result;
|
55
|
+
result.real = x.real;
|
56
|
+
result.imag = -(x.imag);
|
57
|
+
|
58
|
+
return result;
|
59
|
+
}
|
60
|
+
|
61
|
+
double c_real(const complex_t x)
|
62
|
+
{
|
63
|
+
return x.real;
|
64
|
+
}
|
65
|
+
|
66
|
+
double c_imag(const complex_t x)
|
67
|
+
{
|
68
|
+
return x.imag;
|
69
|
+
}
|
70
|
+
|
71
|
+
complex_t c_exp(const complex_t x)
|
72
|
+
{
|
73
|
+
double real_exp = exp(x.real);
|
74
|
+
|
75
|
+
complex_t result;
|
76
|
+
result.real = real_exp * cos(x.imag);
|
77
|
+
result.imag = real_exp * sin(x.imag);
|
78
|
+
|
79
|
+
return result;
|
80
|
+
}
|
@@ -0,0 +1,397 @@
|
|
1
|
+
#include "../src/complex_numbers.h"
|
2
|
+
|
3
|
+
#define UNITY_FLOAT_TYPE double
|
4
|
+
#include "vendor/unity.h"
|
5
|
+
|
6
|
+
#include <math.h>
|
7
|
+
|
8
|
+
#define PI acos(-1)
|
9
|
+
#define E exp(1)
|
10
|
+
|
11
|
+
void compare_complex(complex_t lhs, complex_t rhs)
|
12
|
+
{
|
13
|
+
TEST_ASSERT_EQUAL_FLOAT(lhs.real, rhs.real);
|
14
|
+
TEST_ASSERT_EQUAL_FLOAT(lhs.imag, rhs.imag);
|
15
|
+
}
|
16
|
+
|
17
|
+
void test_imaginary_unit(void)
|
18
|
+
{
|
19
|
+
complex_t z = {.real = 0.0,.imag = 1.0 };
|
20
|
+
|
21
|
+
complex_t expected = {.real = -1.0,.imag = 0.0 };
|
22
|
+
complex_t actual = c_mul(z, z);
|
23
|
+
|
24
|
+
compare_complex(expected, actual);
|
25
|
+
}
|
26
|
+
|
27
|
+
void test_add_purely_real_numbers(void)
|
28
|
+
{
|
29
|
+
TEST_IGNORE();
|
30
|
+
|
31
|
+
complex_t z1 = {.real = 1.0,.imag = 0.0 };
|
32
|
+
complex_t z2 = {.real = 2.0,.imag = 0.0 };
|
33
|
+
|
34
|
+
complex_t expected = {.real = 3.0,.imag = 0.0 };
|
35
|
+
complex_t actual = c_add(z1, z2);
|
36
|
+
|
37
|
+
compare_complex(expected, actual);
|
38
|
+
}
|
39
|
+
|
40
|
+
void test_add_purely_imaginary_numbers(void)
|
41
|
+
{
|
42
|
+
TEST_IGNORE();
|
43
|
+
complex_t z1 = {.real = 0.0,.imag = 1.0 };
|
44
|
+
complex_t z2 = {.real = 0.0,.imag = 2.0 };
|
45
|
+
|
46
|
+
complex_t expected = {.real = 0.0,.imag = 3.0 };
|
47
|
+
complex_t actual = c_add(z1, z2);
|
48
|
+
|
49
|
+
compare_complex(expected, actual);
|
50
|
+
}
|
51
|
+
|
52
|
+
void test_add_numbers_with_real_and_imaginary_part(void)
|
53
|
+
{
|
54
|
+
TEST_IGNORE();
|
55
|
+
complex_t z1 = {.real = 1.0,.imag = 2.0 };
|
56
|
+
complex_t z2 = {.real = 3.0,.imag = 4.0 };
|
57
|
+
|
58
|
+
complex_t expected = {.real = 4.0,.imag = 6.0 };
|
59
|
+
complex_t actual = c_add(z1, z2);
|
60
|
+
|
61
|
+
compare_complex(expected, actual);
|
62
|
+
}
|
63
|
+
|
64
|
+
void test_subtract_purely_real_numbers(void)
|
65
|
+
{
|
66
|
+
TEST_IGNORE();
|
67
|
+
complex_t z1 = {.real = 1.0,.imag = 0.0 };
|
68
|
+
complex_t z2 = {.real = 2.0,.imag = 0.0 };
|
69
|
+
|
70
|
+
complex_t expected = {.real = -1.0,.imag = 0.0 };
|
71
|
+
complex_t actual = c_sub(z1, z2);
|
72
|
+
|
73
|
+
compare_complex(expected, actual);
|
74
|
+
}
|
75
|
+
|
76
|
+
void test_subtract_purely_imaginary_numbers(void)
|
77
|
+
{
|
78
|
+
TEST_IGNORE();
|
79
|
+
complex_t z1 = {.real = 0.0,.imag = 1.0 };
|
80
|
+
complex_t z2 = {.real = 0.0,.imag = 2.0 };
|
81
|
+
|
82
|
+
complex_t expected = {.real = 0.0,.imag = -1.0 };
|
83
|
+
complex_t actual = c_sub(z1, z2);
|
84
|
+
|
85
|
+
compare_complex(expected, actual);
|
86
|
+
}
|
87
|
+
|
88
|
+
void test_subtract_numbers_with_real_and_imaginary_part(void)
|
89
|
+
{
|
90
|
+
TEST_IGNORE();
|
91
|
+
complex_t z1 = {.real = 1.0,.imag = 2.0 };
|
92
|
+
complex_t z2 = {.real = 3.0,.imag = 4.0 };
|
93
|
+
|
94
|
+
complex_t expected = {.real = -2.0,.imag = -2.0 };
|
95
|
+
complex_t actual = c_sub(z1, z2);
|
96
|
+
|
97
|
+
compare_complex(expected, actual);
|
98
|
+
}
|
99
|
+
|
100
|
+
void test_multiply_purely_real_numbers(void)
|
101
|
+
{
|
102
|
+
TEST_IGNORE();
|
103
|
+
complex_t z1 = {.real = 1.0,.imag = 0.0 };
|
104
|
+
complex_t z2 = {.real = 2.0,.imag = 0.0 };
|
105
|
+
|
106
|
+
complex_t expected = {.real = 2.0,.imag = 0.0 };
|
107
|
+
complex_t actual = c_mul(z1, z2);
|
108
|
+
|
109
|
+
compare_complex(expected, actual);
|
110
|
+
}
|
111
|
+
|
112
|
+
void test_multiply_purely_imaginary_numbers(void)
|
113
|
+
{
|
114
|
+
TEST_IGNORE();
|
115
|
+
complex_t z1 = {.real = 0.0,.imag = 1.0 };
|
116
|
+
complex_t z2 = {.real = 0.0,.imag = 2.0 };
|
117
|
+
|
118
|
+
complex_t expected = {.real = -2.0,.imag = 0.0 };
|
119
|
+
complex_t actual = c_mul(z1, z2);
|
120
|
+
|
121
|
+
compare_complex(expected, actual);
|
122
|
+
}
|
123
|
+
|
124
|
+
void test_multiply_numbers_with_real_and_imaginary_part(void)
|
125
|
+
{
|
126
|
+
TEST_IGNORE();
|
127
|
+
complex_t z1 = {.real = 1.0,.imag = 2.0 };
|
128
|
+
complex_t z2 = {.real = 3.0,.imag = 4.0 };
|
129
|
+
|
130
|
+
complex_t expected = {.real = -5.0,.imag = 10.0 };
|
131
|
+
complex_t actual = c_mul(z1, z2);
|
132
|
+
|
133
|
+
compare_complex(expected, actual);
|
134
|
+
}
|
135
|
+
|
136
|
+
void test_divide_purely_real_numbers(void)
|
137
|
+
{
|
138
|
+
TEST_IGNORE();
|
139
|
+
complex_t z1 = {.real = 1.0,.imag = 0.0 };
|
140
|
+
complex_t z2 = {.real = 2.0,.imag = 0.0 };
|
141
|
+
|
142
|
+
complex_t expected = {.real = 0.5,.imag = 0.0 };
|
143
|
+
complex_t actual = c_div(z1, z2);
|
144
|
+
|
145
|
+
compare_complex(expected, actual);
|
146
|
+
}
|
147
|
+
|
148
|
+
void test_divide_purely_imaginary_numbers(void)
|
149
|
+
{
|
150
|
+
TEST_IGNORE();
|
151
|
+
complex_t z1 = {.real = 0.0,.imag = 1.0 };
|
152
|
+
complex_t z2 = {.real = 0.0,.imag = 2.0 };
|
153
|
+
|
154
|
+
complex_t expected = {.real = 0.5,.imag = 0.0 };
|
155
|
+
complex_t actual = c_div(z1, z2);
|
156
|
+
|
157
|
+
compare_complex(expected, actual);
|
158
|
+
}
|
159
|
+
|
160
|
+
void test_divide_numbers_with_real_and_imaginary_part(void)
|
161
|
+
{
|
162
|
+
TEST_IGNORE();
|
163
|
+
complex_t z1 = {.real = 1.0,.imag = 2.0 };
|
164
|
+
complex_t z2 = {.real = 3.0,.imag = 4.0 };
|
165
|
+
|
166
|
+
complex_t expected = {.real = 0.44,.imag = 0.08 };
|
167
|
+
complex_t actual = c_div(z1, z2);
|
168
|
+
|
169
|
+
compare_complex(expected, actual);
|
170
|
+
}
|
171
|
+
|
172
|
+
void test_abs_of_a_positive_purely_real_number(void)
|
173
|
+
{
|
174
|
+
TEST_IGNORE();
|
175
|
+
complex_t z = {.real = 5.0,.imag = 0.0 };
|
176
|
+
|
177
|
+
double expected = 5.0;
|
178
|
+
double actual = c_abs(z);
|
179
|
+
|
180
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
181
|
+
}
|
182
|
+
|
183
|
+
void test_abs_of_a_negative_purely_real_number(void)
|
184
|
+
{
|
185
|
+
TEST_IGNORE();
|
186
|
+
complex_t z = {.real = -5.0,.imag = 0.0 };
|
187
|
+
|
188
|
+
double expected = 5.0;
|
189
|
+
double actual = c_abs(z);
|
190
|
+
|
191
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
192
|
+
}
|
193
|
+
|
194
|
+
void test_abs_of_a_purely_imaginary_number_with_positive_imaginary_part(void)
|
195
|
+
{
|
196
|
+
TEST_IGNORE();
|
197
|
+
complex_t z = {.real = 0.0,.imag = 5.0 };
|
198
|
+
|
199
|
+
double expected = 5.0;
|
200
|
+
double actual = c_abs(z);
|
201
|
+
|
202
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
203
|
+
}
|
204
|
+
|
205
|
+
void test_abs_of_a_purely_imaginary_number_with_negative_imaginary_part(void)
|
206
|
+
{
|
207
|
+
TEST_IGNORE();
|
208
|
+
complex_t z = {.real = 0.0,.imag = -5.0 };
|
209
|
+
|
210
|
+
double expected = 5.0;
|
211
|
+
double actual = c_abs(z);
|
212
|
+
|
213
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
214
|
+
}
|
215
|
+
|
216
|
+
void test_abs_of_a_number_with_real_and_imaginary_part(void)
|
217
|
+
{
|
218
|
+
TEST_IGNORE();
|
219
|
+
complex_t z = {.real = 3.0,.imag = 4.0 };
|
220
|
+
|
221
|
+
double expected = 5.0;
|
222
|
+
double actual = c_abs(z);
|
223
|
+
|
224
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
225
|
+
}
|
226
|
+
|
227
|
+
void test_complex_conjugate_of_a_purely_real_number(void)
|
228
|
+
{
|
229
|
+
TEST_IGNORE();
|
230
|
+
complex_t z = {.real = 5.0,.imag = 0.0 };
|
231
|
+
|
232
|
+
complex_t expected = {.real = 5.0,.imag = 0.0 };
|
233
|
+
complex_t actual = c_conjugate(z);
|
234
|
+
|
235
|
+
compare_complex(expected, actual);
|
236
|
+
}
|
237
|
+
|
238
|
+
void test_complex_conjugate_of_a_purely_imaginary_number(void)
|
239
|
+
{
|
240
|
+
TEST_IGNORE();
|
241
|
+
complex_t z = {.real = 0.0,.imag = 5.0 };
|
242
|
+
|
243
|
+
complex_t expected = {.real = 0.0,.imag = -5.0 };
|
244
|
+
complex_t actual = c_conjugate(z);
|
245
|
+
|
246
|
+
compare_complex(expected, actual);
|
247
|
+
}
|
248
|
+
|
249
|
+
void test_complex_conjugate_of_a_number_with_real_and_imaginary_part(void)
|
250
|
+
{
|
251
|
+
TEST_IGNORE();
|
252
|
+
complex_t z = {.real = 1.0,.imag = 1.0 };
|
253
|
+
|
254
|
+
complex_t expected = {.real = 1.0,.imag = -1.0 };
|
255
|
+
complex_t actual = c_conjugate(z);
|
256
|
+
|
257
|
+
compare_complex(expected, actual);
|
258
|
+
}
|
259
|
+
|
260
|
+
void test_real_part_of_a_purely_real_number(void)
|
261
|
+
{
|
262
|
+
TEST_IGNORE();
|
263
|
+
complex_t z = {.real = 1.0,.imag = 0.0 };
|
264
|
+
|
265
|
+
double expected = 1.0;
|
266
|
+
double actual = c_real(z);
|
267
|
+
|
268
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
269
|
+
}
|
270
|
+
|
271
|
+
void test_real_part_of_a_purely_imaginary_number(void)
|
272
|
+
{
|
273
|
+
TEST_IGNORE();
|
274
|
+
complex_t z = {.real = 0.0,.imag = 1.0 };
|
275
|
+
|
276
|
+
double expected = 0.0;
|
277
|
+
double actual = c_real(z);
|
278
|
+
|
279
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
280
|
+
}
|
281
|
+
|
282
|
+
void test_real_part_of_a_number_with_real_and_imaginary_part(void)
|
283
|
+
{
|
284
|
+
TEST_IGNORE();
|
285
|
+
complex_t z = {.real = 1.0,.imag = 2.0 };
|
286
|
+
|
287
|
+
double expected = 1.0;
|
288
|
+
double actual = c_real(z);
|
289
|
+
|
290
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
291
|
+
}
|
292
|
+
|
293
|
+
void test_imaginary_part_of_a_purely_real_number(void)
|
294
|
+
{
|
295
|
+
TEST_IGNORE();
|
296
|
+
complex_t z = {.real = 1.0,.imag = 0.0 };
|
297
|
+
|
298
|
+
double expected = 0.0;
|
299
|
+
double actual = c_imag(z);
|
300
|
+
|
301
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
302
|
+
}
|
303
|
+
|
304
|
+
void test_imaginary_part_of_a_purely_imaginary_number(void)
|
305
|
+
{
|
306
|
+
TEST_IGNORE();
|
307
|
+
complex_t z = {.real = 0.0,.imag = 1.0 };
|
308
|
+
|
309
|
+
double expected = 1.0;
|
310
|
+
double actual = c_imag(z);
|
311
|
+
|
312
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
313
|
+
}
|
314
|
+
|
315
|
+
void test_imaginary_part_of_a_number_with_real_and_imaginary_part(void)
|
316
|
+
{
|
317
|
+
TEST_IGNORE();
|
318
|
+
complex_t z = {.real = 1.0,.imag = 2.0 };
|
319
|
+
|
320
|
+
double expected = 2.0;
|
321
|
+
double actual = c_imag(z);
|
322
|
+
|
323
|
+
TEST_ASSERT_EQUAL_FLOAT(expected, actual);
|
324
|
+
}
|
325
|
+
|
326
|
+
void test_eulers_identity(void)
|
327
|
+
{
|
328
|
+
TEST_IGNORE();
|
329
|
+
complex_t z = {.real = 0.0,.imag = PI };
|
330
|
+
|
331
|
+
complex_t expected = {.real = -1.0,.imag = 0.0 };
|
332
|
+
complex_t actual = c_exp(z);
|
333
|
+
|
334
|
+
TEST_ASSERT_FLOAT_WITHIN(1e-10, expected.real, actual.real);
|
335
|
+
TEST_ASSERT_FLOAT_WITHIN(1e-10, expected.imag, actual.imag);
|
336
|
+
}
|
337
|
+
|
338
|
+
void test_exponential_of_zero(void)
|
339
|
+
{
|
340
|
+
TEST_IGNORE();
|
341
|
+
complex_t zero = {.real = 0.0,.imag = 0.0 };
|
342
|
+
|
343
|
+
complex_t expected = {.real = 1.0,.imag = 0.0 };
|
344
|
+
complex_t actual = c_exp(zero);
|
345
|
+
|
346
|
+
compare_complex(expected, actual);
|
347
|
+
}
|
348
|
+
|
349
|
+
void test_exponential_of_a_purely_real_number(void)
|
350
|
+
{
|
351
|
+
TEST_IGNORE();
|
352
|
+
complex_t z = {.real = 1.0,.imag = 0.0 };
|
353
|
+
|
354
|
+
complex_t expected = {.real = E,.imag = 0.0 };
|
355
|
+
complex_t actual = c_exp(z);
|
356
|
+
|
357
|
+
compare_complex(expected, actual);
|
358
|
+
}
|
359
|
+
|
360
|
+
int main(void)
|
361
|
+
{
|
362
|
+
UnityBegin("test/test_complex_numbers.c");
|
363
|
+
|
364
|
+
RUN_TEST(test_imaginary_unit);
|
365
|
+
RUN_TEST(test_add_purely_real_numbers);
|
366
|
+
RUN_TEST(test_add_purely_imaginary_numbers);
|
367
|
+
RUN_TEST(test_add_numbers_with_real_and_imaginary_part);
|
368
|
+
RUN_TEST(test_subtract_purely_real_numbers);
|
369
|
+
RUN_TEST(test_subtract_purely_imaginary_numbers);
|
370
|
+
RUN_TEST(test_subtract_numbers_with_real_and_imaginary_part);
|
371
|
+
RUN_TEST(test_multiply_numbers_with_real_and_imaginary_part);
|
372
|
+
RUN_TEST(test_multiply_numbers_with_real_and_imaginary_part);
|
373
|
+
RUN_TEST(test_multiply_numbers_with_real_and_imaginary_part);
|
374
|
+
RUN_TEST(test_divide_numbers_with_real_and_imaginary_part);
|
375
|
+
RUN_TEST(test_divide_numbers_with_real_and_imaginary_part);
|
376
|
+
RUN_TEST(test_divide_numbers_with_real_and_imaginary_part);
|
377
|
+
RUN_TEST(test_abs_of_a_positive_purely_real_number);
|
378
|
+
RUN_TEST(test_abs_of_a_negative_purely_real_number);
|
379
|
+
RUN_TEST(test_abs_of_a_purely_imaginary_number_with_positive_imaginary_part);
|
380
|
+
RUN_TEST(test_abs_of_a_purely_imaginary_number_with_negative_imaginary_part);
|
381
|
+
RUN_TEST(test_abs_of_a_number_with_real_and_imaginary_part);
|
382
|
+
RUN_TEST(test_complex_conjugate_of_a_purely_real_number);
|
383
|
+
RUN_TEST(test_complex_conjugate_of_a_purely_imaginary_number);
|
384
|
+
RUN_TEST(test_complex_conjugate_of_a_number_with_real_and_imaginary_part);
|
385
|
+
RUN_TEST(test_real_part_of_a_purely_real_number);
|
386
|
+
RUN_TEST(test_real_part_of_a_purely_imaginary_number);
|
387
|
+
RUN_TEST(test_real_part_of_a_number_with_real_and_imaginary_part);
|
388
|
+
RUN_TEST(test_imaginary_part_of_a_purely_real_number);
|
389
|
+
RUN_TEST(test_imaginary_part_of_a_purely_imaginary_number);
|
390
|
+
RUN_TEST(test_imaginary_part_of_a_number_with_real_and_imaginary_part);
|
391
|
+
RUN_TEST(test_eulers_identity);
|
392
|
+
RUN_TEST(test_exponential_of_zero);
|
393
|
+
RUN_TEST(test_exponential_of_a_purely_real_number);
|
394
|
+
|
395
|
+
UnityEnd();
|
396
|
+
return 0;
|
397
|
+
}
|