## Pairing-based calculator

The `pbc` subdirectory contains the pairing-based calculator, `pbc`, which is loosely based on `bc`, a well-known arbitrary precision calculator.

See `pairing_test.pbc` for an example script. Some differences: the assignment operator is `:=`, and newlines are ordinary whitespace and not statement terminators.

If started with the `-y` option, the syntax is compatible with `bc`: newlines are treated as statement terminators and `=` is assignment. Additionally, `pbc` displays a prompt. This mode may be easier for beginners.

Initially, the variables G1, G2, GT and Zr are represent groups associated with a particular A pairing.

An element is represented with a tree of integers, such as `[[1,2], 3]`, or `4`.

Assignments such as ```variable := expression;``` return the value of the variable.

The arithmetic operators ```+, -, /, *, ^``` have the standard precedence. The C comparison operators and ternary operator are available.

Each statement should be terminated by a semicolon.

Comments are the same as in (original) C, or begin with "#" and end at a newline.

Some of the pbc functions:

`init_pairing_A()`

Set the variables G1, G2, GT and Zr to the groups in a particular A pairing:

```init_pairing_A();
```

Other sample pairings can be used by replacing `A` with one of `D, E, F, G`.

`rnd(`G`)`

Returns a random element of an algebraic structure G, e.g:

```g := rnd(Zr);
```

Synonym: `random`.

`pairing(`g, h`)`

Returns the pairing applied to g and h. The element g must be an element of G1 and h of G2, e.g:

```pairing(rnd(G1), rnd(G2));
```
G`(`g`)`

Maps an element g to element of the field G, e.g:

```Zr(123);
GT([456, 789]);
```