# Linear Codes over Finite Rings

- [Introduction](introduction.md)

- [Constructions](creation.md)

  - [General Linear Codes](creation.md#general-linear-codes)

    - [`LinearCode<R, n | L>: Rng, RngIntElt, List → Code`](creation.md#constructor-constructor-linearcode-rng-rngintelt-list-code)

    - [`LinearCode(U): ModTupRng → Code`](creation.md#function-linearcode-modtuprng)

    - [`LinearCode(A): ModMatRngElt → Code`](creation.md#function-linearcode-modmatrngelt)

    - [`PermutationCode(u, G): ModTupRngElt, GrpPerm → Code`](creation.md#function-permutationcode-modtuprngelt-grpperm)

    - [`Example: Ternary Golay Code`](creation.md#example-ex-adca47)

    - [`Example: Code From Matrix`](creation.md#example-ex-11a0fe)

    - [`Example: Permutation Code`](creation.md#example-ex-215ff7)

  - [Simple Linear Codes](creation.md#simple-linear-codes)

    - [`ZeroCode(R, n): Rng, RngIntElt → Code`](creation.md#function-zerocode-rng-rngintelt)

    - [`RepetitionCode(R, n): Rng, RngIntElt → Code`](creation.md#function-repetitioncode-rng-rngintelt)

    - [`ZeroSumCode(R, n): Rng, RngIntElt → Code`](creation.md#function-zerosumcode-rng-rngintelt)

    - [`UniverseCode(R, n): Rng, RngIntElt → Code`](creation.md#function-universecode-rng-rngintelt)

    - [`RandomLinearCode(R, n, k): Rng, RngIntElt, RngIntElt → Code`](creation.md#function-randomlinearcode-rng-rngintelt-rngintelt)

    - [`Example: Simple Finite Ring`](creation.md#example-ex-3c3cdf)

  - [General Cyclic Codes](creation.md#general-cyclic-codes)

    - [`CyclicCode(u): ModTupRngElt → Code`](creation.md#function-cycliccode-modtuprngelt)

    - [`CyclicCode(n, g): RngIntElt, RngUPolElt → Code`](creation.md#function-cycliccode-rngintelt-rngupolelt)

    - [`CyclotomicFactors(R, n): Rng, RngIntElt → [RngUPolElt]`](creation.md#function-cyclotomicfactors-rng-rngintelt)

    - [`Example: Cyclic Code`](creation.md#example-ex-567853)

    - [`Example: Cyclic Galois Ring`](creation.md#example-ex-63adb5)

- [Invariants](access.md)

  - [`# C: Code → RngIntElt`](access.md#operation-operation-code-rngintelt)

  - [`C . i: Code, RngIntElt → ModTupRngElt`](access.md#operation-operation-code-rngintelt-modtuprngelt)

  - [`Name(C, i): Code, RngIntElt → ModTupRngElt`](access.md#function-name-code-rngintelt)

  - [`Alphabet(C): Code → Rng`](access.md#function-alphabet-code)

  - [`AmbientSpace(C): Code → ModTupRng`](access.md#function-ambientspace-code)

  - [`Basis(C): Code → [ ModTupRngElt ]`](access.md#function-basis-code)

  - [`Generators(C): Code → { ModTupRngElt }`](access.md#function-generators-code)

  - [`GeneratorMatrix(C): Code → ModMatRngElt`](access.md#function-generatormatrix-code)

  - [`Generic(C): Code → Code`](access.md#function-generic-code)

  - [`Length(C): Code → RngIntElt`](access.md#function-length-code)

  - [`PseudoDimension(C): Code → RngIntElt`](access.md#function-pseudodimension-code)

  - [`NumberOfGenerators(C): Code → RngIntElt`](access.md#function-numberofgenerators-code)

  - [`Ngens(C): Code → RngIntElt`](access.md#function-ngens-code)

  - [`ParityCheckMatrix(C): Code → ModMatRngElt`](access.md#function-paritycheckmatrix-code)

  - [`Random(C): Code → ModTupRngElt`](access.md#function-random-code)

  - [`RSpace(C): Code → ModTupRng`](access.md#function-rspace-code)

  - [`InformationRate(C): Code → RngPrElt`](access.md#function-informationrate-code)

- [Subcodes](subcode.md)

  - [The Subcode Constructor](subcode.md#the-subcode-constructor)

    - [`sub<C | L>: Code, List → Code`](subcode.md#constructor-constructor-sub-code-list-code)

    - [`Subcode(C, t): Code, RngIntElt → Code`](subcode.md#function-subcode-code-rngintelt)

    - [`Subcode(C, S): Code, {RngIntElt} → Code`](subcode.md#function-subcode-code-rngintelt-2)

    - [`Example: Subcode Galois Rings`](subcode.md#example-ex-89c02d)

- [Boolean Predicates](Boolean.md)

  - [`u in C: ModTupRngElt, Code → BoolElt`](Boolean.md#operation-op-in-modtuprngelt-code)

  - [`u notin C: ModTupRngElt, Code → BoolElt`](Boolean.md#operation-op-notin-modtuprngelt-code)

  - [`C subset D: Code, Code → BoolElt`](Boolean.md#operation-op-subset-code-code)

  - [`C notsubset D: Code, Code → BoolElt`](Boolean.md#operation-operation-notsubset-code-code-boolelt)

  - [`C eq D: Code, Code → BoolElt`](Boolean.md#operation-op-eq-code-code)

  - [`C ne D: Code, Code → BoolElt`](Boolean.md#operation-op-ne-code-code)

  - [`IsCyclic(C): Code → BoolElt`](Boolean.md#function-iscyclic-code)

  - [`IsSelfDual(C): Code → BoolElt`](Boolean.md#function-isselfdual-code)

  - [`IsSelfOrthogonal(C): Code → BoolElt`](Boolean.md#function-isselforthogonal-code)

  - [`IsProjective(C): Code → BoolElt`](Boolean.md#function-isprojective-code)

  - [`IsZero(u): ModTupRngElt → BoolElt`](Boolean.md#function-iszero-modtuprngelt)

  - [`Example: Self Dual Z4`](Boolean.md#example-ex-659440)

- [New Codes from Old](operation.md)

  - [Sum, Intersection and Dual](operation.md#sum-intersection-and-dual)

    - [`C + D: Code, Code → Code`](operation.md#operation-op-plus-code-code)

    - [`C meet D: Code, Code → Code`](operation.md#operation-op-meet-code-code)

    - [`Dual(C): Code → Code`](operation.md#function-dual-code)

    - [`Example: Sum Intersection`](operation.md#example-ex-e4970a)

  - [Standard Constructions](operation.md#standard-constructions)

    - [`DirectSum(C, D): Code, Code → Code`](operation.md#function-directsum-code-code)

    - [`DirectProduct(C, D): Code, Code → Code`](operation.md#function-directproduct-code-code)

    - [`C1 cat C2: Code, Code → Code`](operation.md#operation-operation-cat-code-code-code)

    - [`ExtendCode(C): Code → Code`](operation.md#function-extendcode-code)

    - [`ExtendCode(C, n): Code, RngIntElt → Code`](operation.md#function-extendcode-code-rngintelt)

    - [`PadCode(C, n): Code, RngIntElt → Code`](operation.md#function-padcode-code-rngintelt)

    - [`PlotkinSum(C, D): Code, Code → Code`](operation.md#function-plotkinsum-code-code)

    - [`PunctureCode(C, i): Code, RngIntElt → Code`](operation.md#function-puncturecode-code-rngintelt)

    - [`PunctureCode(C, S): Code, { RngIntElt } → Code`](operation.md#function-puncturecode-code-rngintelt-2)

    - [`ShortenCode(C, i): Code, RngIntElt → Code`](operation.md#function-shortencode-code-rngintelt)

    - [`ShortenCode(C, S): Code, { RngIntElt } → Code`](operation.md#function-shortencode-code-rngintelt-2)

    - [`Example: lengths`](operation.md#example-ex-fe796f)

    - [`Example: Punct Z4`](operation.md#example-ex-0c4967)

- [Codeword Operations](element.md)

  - [Construction](element.md#construction)

    - [`C ! [a₁, ..., aₙ]: Code, [ RngElt ] → ModTupRngElt`](element.md#operation-op-code-rngelt)

    - [`elt< C | a₁, ..., aₙ>: Code, List → ModTupRngElt`](element.md#constructor-constructor-elt-code-list-modtuprngelt)

    - [`C ! u: Code, ModTupRngElt → ModTupRngElt`](element.md#operation-op-code-modtuprngelt)

    - [`C ! 0: Code, RngIntElt → ModTupRngElt`](element.md#operation-op-code-rngintelt)

    - [`Example: Code Elts`](element.md#example-ex-c7f5f7)

  - [Operations](element.md#operations)

    - [`u + v: ModTupRngElt, ModTupRngElt → ModTupRngElt`](element.md#operation-op-plus-modtuprngelt-modtuprngelt)

    - [`- u: ModTupRngElt → ModTupRngElt`](element.md#operation-operation-modtuprngelt-modtuprngelt)

    - [`u - v: ModTupRngElt, ModTupRngElt → ModTupRngElt`](element.md#operation-op-minus-modtuprngelt-modtuprngelt)

    - [`a * u: RngElt, ModTupRngElt → ModTupRngElt`](element.md#operation-op-times-rngelt-modtuprngelt)

    - [`Weight(v): ModTupRngElt → RngIntElt`](element.md#function-weight-modtuprngelt)

    - [`Distance(u, v): ModTupRngElt, ModTupRngElt → RngIntElt`](element.md#function-distance-modtuprngelt-modtuprngelt)

    - [`Support(w): ModTupRngElt → { RngIntElt }`](element.md#function-support-modtuprngelt)

    - [`(u, v): ModTupRngElt, ModTupRngElt → RngElt`](element.md#literal-literal-u-v-modtuprngelt-modtuprngelt-rngelt)

    - [`InnerProduct(u, v): ModTupRngElt, ModTupRngElt → RngElt`](element.md#function-innerproduct-modtuprngelt-modtuprngelt)

    - [`Coordinates(C, u): Code, ModTupRngElt → [ RngFinElt ]`](element.md#function-coordinates-code-modtuprngelt)

    - [`Normalize(u): ModTupRngElt → ModTupRngElt`](element.md#function-normalize-modtuprngelt)

    - [`Rotate(u, k): ModTupRngElt, RngIntElt → ModTupRngElt`](element.md#function-rotate-modtuprngelt-rngintelt)

    - [`Rotate(~u, k): ModTupRngElt, RngIntElt`](element.md#function-rotate-modtuprngelt-rngintelt-ref)

    - [`Parent(w): ModTupRngElt → ModTupRng`](element.md#function-parent-modtuprngelt)

    - [`Example: Codeword Ops`](element.md#example-ex-38a7a5)

  - [Accessing Components of a Codeword](element.md#accessing-components-of-a-codeword)

    - [`u[i]: ModTupRngElt, RngIntElt → RngElt`](element.md#indexed-indexed-u-modtuprngelt-rngintelt-rngelt)

    - [`u[i] := x;`](element.md#literal-literal-u-i-x)

- [Weight Distributions](weight-distribution.md)

  - [Hamming Weight](weight-distribution.md#hamming-weight)

    - [`MinimumWeight(C): Code → RngIntElt`](weight-distribution.md#function-minimumweight-code)

    - [`MinimumDistance(C): Code → RngIntElt`](weight-distribution.md#function-minimumdistance-code)

    - [`WeightDistribution(C): Code → [ <RngIntElt, RngIntElt> ]`](weight-distribution.md#function-weightdistribution-code)

    - [`DualWeightDistribution(C): Code → [ <RngIntElt, RngIntElt> ]`](weight-distribution.md#function-dualweightdistribution-code)

    - [`Example: Weight Dist Cyc`](weight-distribution.md#example-ex-bb2d09)

- [Weight Enumerators](weight-enumerator.md)

  - [`CompleteWeightEnumerator(C): Code → RngMPolElt`](weight-enumerator.md#function-completeweightenumerator-code)

  - [`WeightEnumerator(C): Code → RngMPolElt`](weight-enumerator.md#function-weightenumerator-code)

  - [`HammingWeightEnumerator(C): Code → RngMPolElt`](weight-enumerator.md#function-hammingweightenumerator-code)

  - [`Example: WeightEnum Galois Rings`](weight-enumerator.md#example-ex-1d525d)
