Relevant links [here](https://en.wikipedia.org/wiki/Kronecker_symbol) and [here](http://mathworld.wolfram.com/KroneckerSymbol.html), but here is the short version:

You have an input of two integers \$a\$ and \$b\$ between negative infinity and infinity (though if necessary, I can restrict the range, but the function must still accept negative inputs).

**Definition of the Kronecker symbol**

You must return the Kronecker symbol \$(a|b)\$ for inputs \$a\$ and \$b\$ where

$$(a|b) = (a|p\_1)^{e\_1} \cdot (a|p\_2)^{e\_2} \cdots (a|p\_n)^{e\_n}$$

where \$b = p\_1^{e\_1} \cdot p\_2^{e\_2} \cdots p\_n^{e\_n}\$, and \$p\_i\$ and \$e\_i\$ are the primes and exponents in the prime factorization of \$b\$.

* For an odd prime \$p\$, \$(a|p)=a^{\frac{p-1}2} \mod p\$ as defined [here](http://mathworld.wolfram.com/LegendreSymbol.html).
* For \$b = 2\$,

$$
(n|2) = \begin{cases}
0 & \text{if } n \equiv 0 \mod 2 \\
1 & \text{if } n \equiv \pm 1 \mod 8 \\
-1 & \text{if } n \equiv \mp 3 \mod 8
\end{cases}
$$

* For \$b = -1\$,

$$
(n|-1) = \begin{cases}
-1 & \text{if } n < 0 \\
1 & \text{if } n \ge 0
\end{cases}
$$

* If \$a \ge b\$, \$(a|b) = (z|b)\$ where \$z = a\mod b\$. By this property, and as explained [here](https://en.wikipedia.org/wiki/Legendre_symbol) and [here](https://en.wikipedia.org/wiki/Kronecker_symbol), \$a\$ is a quadratic residue of \$b\$ if \$z\$ is, even though \$a \ge b\$.
* \$(-1|b) = 1\$ if \$b \equiv 0,1,2 \mod 4\$ and \$-1\$ if \$b = 3 \mod 4\$.
* \$(0|b)\$ is \$0\$ except for \$(0|1)\$ which is \$1\$, because \$(a|1)\$ is always \$1\$ and for negative \$a\$, \$(-a|b) = (-1|b) \times (a|b)\$.

The output of the Kronecker symbol is always \$-1, 0 \text{ or } 1\$, where the output is \$0\$ if \$a\$ and \$b\$ have any common factors. If \$b\$ is an odd prime, \$(a|b) = 1\$ if \$a\$ is a [quadratic residue](https://codegolf.stackexchange.com/questions/65329/is-q-a-quadratic-residue-of-n) \$\mod b\$, and \$-1\$ if is it is not a quadratic residue.

**Rules**

* Your code must be a program or a function.
* The inputs must be in the order `a b`.
* The output must be either \$-1, 0 \text{ or } 1\$.
* This is code golf, so your code does not have to be efficient, just short.
* No built-ins that directly calculate the Kronecker or the related Jacobi and Legendre symbols. Other built-ins (for prime factorization, for example) are fair game.

**Examples**

```
>>> kronecker(1, 5)
1
>>> kronecker(3, 8)
-1
>>> kronecker(15, 22)
1
>>> kronecker(21, 7)
0
>>> kronecker(5, 31)
1
>>> kronecker(31, 5)
1
>>> kronecker(7, 19)
1
>>> kronecker(19, 7)
-1
>>> kronecker(323, 455625)
1
>>> kronecker(0, 12)
0
>>> kronecker(0, 1)
1
>>> kronecker(12, 0)
0
>>> kronecker(1, 0)
1
>>> kronecker(-1, 5)
1
>>> kronecker(1, -5)
1
>>> kronecker(-1, -5)
-1
>>> kronecker(6, 7)
-1
>>> kronecker(-1, -7)
1
>>> kronecker(-6, -7)
-1

```

This is a complicated function, so please let me know if anything is unclear.