# Weight Distributions

In the case of a linear code, weight and distance distributions are equivalent (in particular minimum weight and minimum distance are equivalent).

## Hamming Weight

For an element $x\in R$ for any finite ring $R$, the *Hamming weight* $w_H(x)$ is defined by:

$$
w_H(x) = 0 \iff x = 0, \qquad w_H(x) = 1 \iff x \ne 0
$$

The *Hamming weight* $w_H(v)$ of a vector $v\in {R^n}$ is defined to be the sum (in ${\mathbb{Z}}$) of the Hamming weights of its components.

The *Hamming weight* is often referred to as simply the *weight*.

### `MinimumWeight(C): Code -> RngIntElt`

### `MinimumDistance(C): Code -> RngIntElt`

Determine the minimum (Hamming) weight of the words belonging to the code $C$, which is also the minimum distance between any two codewords.

### `WeightDistribution(C): Code -> [ <RngIntElt, RngIntElt> ]`

Determine the (Hamming) weight distribution for the code $C$. The distribution is returned in the form of a sequence of tuples, where the $i$-th tuple contains the $i$-th weight, $w_i$ say, and the number of codewords having weight $w_i$.

### `DualWeightDistribution(C): Code -> [ <RngIntElt, RngIntElt> ]`

Determine the (Hamming) weight distribution of the dual code of $C$. The distribution is returned in the form of a sequence of tuples, where the $i$-th tuple contains the $i$-th weight, $w_i$ say, and the number of codewords having weight $w_i$.

### `Example: Weight Dist K8 (ex-601dad)`

In this example, the weight distribution of a quadratic residue code over ${\mathbb{Z}}_4$ and its dual are computed.

```magma
> C := QRCodeZ4(17);
> C;

((17, 4^9 2^0)) Cyclic Linear Code over IntegerRing(4)

Generator matrix:
[1 0 0 0 0 0 0 0 0 1 1 3 0 3 0 3 1]
[0 1 0 0 0 0 0 0 0 3 0 2 3 1 3 1 2]
[0 0 1 0 0 0 0 0 0 2 1 2 2 1 1 1 3]
[0 0 0 1 0 0 0 0 0 1 3 0 2 1 1 0 2]
[0 0 0 0 1 0 0 0 0 2 3 1 0 0 1 3 2]
[0 0 0 0 0 1 0 0 0 2 0 1 1 2 0 3 1]
[0 0 0 0 0 0 1 0 0 3 1 1 1 2 2 1 2]
[0 0 0 0 0 0 0 1 0 2 1 3 1 3 2 0 3]
[0 0 0 0 0 0 0 0 1 1 3 0 3 0 3 1 1]

> WeightDistribution(C);
[ <0, 1>, <5, 34>, <6, 68>, <7, 748>, <8, 2567>, <9, 6817>, <10, 17612>,
  <11, 34340>, <12, 50014>, <13, 56168>, <14, 50728>, <15, 30872>,
  <16, 9826>, <17, 2349> ]

> DualWeightDistribution(C);
[ <0, 1>, <6, 68>, <8, 935>, <9, 1632>, <10, 4148>, <11, 8568>, <12, 12886>,
  <13, 14280>, <14, 11968>, <15, 7752>, <16, 2890>, <17, 408> ]

```

## Lee Weight

For an element $x\in{\mathbb{Z}}_4$, the *Lee weight* $w_L(x)$ is defined by:

$$
w_L(0) = 0,\quad w_L(1) = w_L(3) = 1,\quad w_L(2) = 2.
$$

The *Lee weight* $w_L(v)$ of a vector $v\in{{\mathbb{Z}}_4^n}$ is defined to be the sum (in ${\mathbb{Z}}$) of the Lee weights of its components. See [[Wan, 1997](../../references.md#cite-wan-z4), p. 16].

### `LeeWeight(a): RngIntRes -> RngIntElt`

The Lee weight of the element $a\in{\mathbb{Z}}_4$.

### `LeeWeight(v): ModTupRngElt -> RngIntElt`

The Lee weight of the codeword $v$.

### `LeeDistance(u, v): ModTupRngElt, ModTupRngElt -> RngIntElt`

The Lee distance between the codewords $u$ and $v$, where $u$ and $v$ belong to the same code $C$. This is defined to be the Lee weight of $(u - v)$.

### `MinimumLeeWeight(C): Code -> RngIntElt`

### `MinimumLeeDistance(C): Code -> RngIntElt`

The minimum Lee weight of the code $C$.

### `LeeWeightDistribution(C): Code -> SeqEnum`

The Lee weight distribution of the code $C$.

### `DualLeeWeightDistribution(C): Code -> SeqEnum`

The Lee weight distribution of the dual of the code $C$ (see `LeeWeightDistribution`)

### `WordsOfLeeWeight(C, w): Code, RngIntElt -> SetEnum`

```magma
NumWords: RngIntElt                    Default: Infinity()
```

Given a linear code $C$, return the set of all words of $C$ having Lee weight $w$. If `NumWords` is set to a non-negative integer $c$, then the algorithm will terminate after a total of $c$ words have been found.

### `WordsOfBoundedLeeWeight(C, l, u): Code, RngIntElt, RngIntElt -> SetEnum`

```magma
NumWords: RngIntElt                    Default: Infinity()
```

Given a linear code $C$, return the set of all words of $C$ having Lee weight between $l$ and $u$, inclusive. If `NumWords` is set to a non-negative integer $c$, then the algorithm will terminate after a total of $c$ words have been found.

### `Example: Lee Dist (ex-587036)`

We calculate the Lee weight distribution of a Reed Muller code over ${\mathbb{Z}}_4$ and enumerate all words of Lee weight $8$.

```magma
> C := ReedMullerCodeZ4(1, 3);
> C;
(8, 256, 4) Linear Code over IntegerRing(4)
Generator matrix:
[1 0 0 0 3 1 2 1]
[0 1 0 0 2 1 1 3]
[0 0 1 0 1 1 3 2]
[0 0 0 1 3 2 3 3]
> LeeWeightDistribution(C);
[ <0, 1>, <6, 112>, <8, 30>, <10, 112>, <16, 1> ]
> W := WordsOfLeeWeight(C, 8);
> #W;
30

```

## Euclidean Weight

For an element $x\in{\mathbb{Z}}_4$, the *Euclidean weight* $w_E(x)$ is defined by:

$$
w_E(0) = 0,\quad w_E(1) = w_E(3) = 1, \quad w_E(2) = 4.
$$

The *Euclidean weight* $w_E(v)$ of a vector $v\in{{\mathbb{Z}}_4^n}$ is defined to be the sum (in ${\mathbb{Z}}$) of the Euclidean weights of its components. See [[Wan, 1997](../../references.md#cite-wan-z4), p. 16].

### `EuclideanWeight(a): RngIntRes -> RngIntElt`

The Euclidean weight of the element $a\in{\mathbb{Z}}4$.

### `EuclideanWeight(v): ModTupRngElt -> RngIntElt`

The Euclidean weight of the ${\mathbb{Z}}_4$-codeword $v$.

### `EuclideanDistance(u, v): ModTupRngElt, ModTupRngElt -> RngIntElt`

The Euclidean distance between the ${\mathbb{Z}}_4$-codewords $u$ and $v$, where $u$ and $v$ belong to the same code $C$. This is defined to be the Euclidean weight of $(u - v)$.

### `MinimumEuclideanWeight(C): Code -> RngIntElt`

### `MinimumEuclideanDistance(C): Code -> RngIntElt`

The minimum Euclidean weight of the ${\mathbb{Z}}_4$-code C.

### `EuclideanWeightDistribution(C): Code -> SeqEnum`

The Euclidean weight distribution of the ${\mathbb{Z}}_4$-code C.

### `DualEuclideanWeightDistribution(C): Code -> SeqEnum`

The Euclidean weight distribution of the dual of the ${\mathbb{Z}}_4$-code C.

### `Example: Euclidean Dist (ex-9f8213)`

The Euclidean weight distribution is calculated for a quadratic residue code over ${\mathbb{Z}}_4$

```magma
> C := QRCodeZ4(17);
> C;
(17, 262144) Cyclic Code over IntegerRing(4)
Generator matrix:
[1 0 0 0 0 0 0 0 0 1 1 3 0 3 0 3 1]
[0 1 0 0 0 0 0 0 0 3 0 2 3 1 3 1 2]
[0 0 1 0 0 0 0 0 0 2 1 2 2 1 1 1 3]
[0 0 0 1 0 0 0 0 0 1 3 0 2 1 1 0 2]
[0 0 0 0 1 0 0 0 0 2 3 1 0 0 1 3 2]
[0 0 0 0 0 1 0 0 0 2 0 1 1 2 0 3 1]
[0 0 0 0 0 0 1 0 0 3 1 1 1 2 2 1 2]
[0 0 0 0 0 0 0 1 0 2 1 3 1 3 2 0 3]
[0 0 0 0 0 0 0 0 1 1 3 0 3 0 3 1 1]
> EuclideanWeightDistribution(C);
[ <0, 1>, <7, 136>, <8, 170>, <9, 170>, <10, 408>, <11, 544>, <12, 986>,
<13, 1768>, <14, 3128>, <15, 5032>, <16, 6120>, <17, 6360>, <18, 8432>,
<19, 12512>, <20, 12682>, <21, 11152>, <22, 14416>, <23, 17680>, <24, 16048>,
<25, 15164>, <26, 17952>, <27, 16864>, <28, 13328>, <29, 14144>, <30, 14144>,
<31, 10064>, <32, 7837>, <33, 8024>, <34, 6800>, <35, 4896>, <36, 3485>,
<37, 2992>, <38, 2992>, <39, 1768>, <40, 510>, <41, 1258>, <42, 1224>,
<44, 238>, <45, 408>, <46, 136>, <47, 136>, <48, 34>, <68, 1> ]

```
