# Fractional ideals #

This file defines fractional ideals of an integral domain and proves basic facts about them.

## Main definitions #

Let S be a submonoid of an integral domain R and P the localization of R at S.

• IsFractional defines which R-submodules of P are fractional ideals
• FractionalIdeal S P is the type of fractional ideals in P
• a coercion coeIdeal : Ideal R → FractionalIdeal S P
• CommSemiring (FractionalIdeal S P) instance: the typical ideal operations generalized to fractional ideals
• Lattice (FractionalIdeal S P) instance

## Main statements #

• mul_left_mono and mul_right_mono state that ideal multiplication is monotone
• mul_div_self_cancel_iff states that 1 / I is the inverse of I if one exists

## Implementation notes #

Fractional ideals are considered equal when they contain the same elements, independent of the denominator a : R such that a I ⊆ R. Thus, we define FractionalIdeal to be the subtype of the predicate IsFractional, instead of having FractionalIdeal be a structure of which a is a field.

Most definitions in this file specialize operations from submodules to fractional ideals, proving that the result of this operation is fractional if the input is fractional. Exceptions to this rule are defining (+) := (⊔) and ⊥ := 0, in order to re-use their respective proof terms. We can still use simp to show ↑I + ↑J = ↑(I + J) and ↑⊥ = ↑0.

Many results in fact do not need that P is a localization, only that P is an R-algebra. We omit the IsLocalization parameter whenever this is practical. Similarly, we don't assume that the localization is a field until we need it to define ideal quotients. When this assumption is needed, we replace S with R⁰, making the localization a field.

## Tags #

fractional ideal, fractional ideals, invertible ideal

def IsFractional {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] (I : ) :

A submodule I is a fractional ideal if a I ⊆ R for some a ≠ 0.

Equations
Instances For
def FractionalIdeal {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] :
Type u_2

The fractional ideals of a domain R are ideals of R divided by some a ∈ R.

More precisely, let P be a localization of R at some submonoid S, then a fractional ideal I ⊆ P is an R-submodule of P, such that there is a nonzero a : R with a I ⊆ R.

Equations
• = { I : // }
Instances For
def FractionalIdeal.coeToSubmodule {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :

Map a fractional ideal I to a submodule by forgetting that ∃ a, a I ⊆ R.

This implements the coercion FractionalIdeal S P → Submodule R P.

Equations
• I = I
Instances For
instance FractionalIdeal.instCoeOutSubmodule {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
CoeOut () ()

Map a fractional ideal I to a submodule by forgetting that ∃ a, a I ⊆ R.

This coercion is typically called coeToSubmodule in lemma names (or coe when the coercion is clear from the context), not to be confused with IsLocalization.coeSubmodule : Ideal R → Submodule R P (which we use to define coe : Ideal R → FractionalIdeal S P).

Equations
• FractionalIdeal.instCoeOutSubmodule = { coe := FractionalIdeal.coeToSubmodule }
theorem FractionalIdeal.isFractional {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
noncomputable def FractionalIdeal.den {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
S

An element of S such that I.den • I = I.num, see FractionalIdeal.num and FractionalIdeal.den_mul_self_eq_num.

Equations
• I.den = ⟨,
Instances For
noncomputable def FractionalIdeal.num {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :

An ideal of R such that I.den • I = I.num, see FractionalIdeal.den and FractionalIdeal.den_mul_self_eq_num.

Equations
Instances For
theorem FractionalIdeal.den_mul_self_eq_num {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
I.den I = Submodule.map () I.num
noncomputable def FractionalIdeal.equivNum {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [] [] {I : } (h_nz : I.den 0) :
I ≃ₗ[R] I.num

The linear equivalence between the fractional ideal I and the integral ideal I.num defined by mapping x to den I • x.

Equations
Instances For
instance FractionalIdeal.instSetLike {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
SetLike () P
Equations
• FractionalIdeal.instSetLike = { coe := fun (I : ) => I, coe_injective' := }
@[simp]
theorem FractionalIdeal.mem_coe {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {x : P} :
x I x I
theorem FractionalIdeal.ext {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } :
(∀ (x : P), x I x J)I = J
@[simp]
theorem FractionalIdeal.equivNum_apply {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [] [] {I : } (h_nz : I.den 0) (x : I) :
() (() x) = I.den x
def FractionalIdeal.copy {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (p : ) (s : Set P) (hs : s = p) :

Copy of a FractionalIdeal with a new underlying set equal to the old one. Useful to fix definitional equalities.

Equations
• p.copy s hs = (p).copy s hs,
Instances For
@[simp]
theorem FractionalIdeal.coe_copy {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (p : ) (s : Set P) (hs : s = p) :
(p.copy s hs) = s
theorem FractionalIdeal.coe_eq {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (p : ) (s : Set P) (hs : s = p) :
p.copy s hs = p
theorem FractionalIdeal.zero_mem {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
0 I
@[simp]
theorem FractionalIdeal.val_eq_coe {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
I = I
@[simp]
theorem FractionalIdeal.coe_mk {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (hI : ) :
I, hI = I
theorem FractionalIdeal.coeToSet_coeToSubmodule {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
I = I

Transfer instances from Submodule R P to FractionalIdeal S P.

instance FractionalIdeal.instModuleSubtypeMemSubmoduleCoeToSubmodule {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
Module R I
Equations
• I.instModuleSubtypeMemSubmoduleCoeToSubmodule = (I).module
theorem FractionalIdeal.coeToSubmodule_injective {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Function.Injective fun (I : ) => I
theorem FractionalIdeal.coeToSubmodule_inj {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } :
I = J I = J
theorem FractionalIdeal.isFractional_of_le_one {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (h : I 1) :
theorem FractionalIdeal.isFractional_of_le {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } (hIJ : I J) :
def FractionalIdeal.coeIdeal {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :

Map an ideal I to a fractional ideal by forgetting I is integral.

This is the function that implements the coercion Ideal R → FractionalIdeal S P.

Equations
• I = ⟨,
Instances For
instance FractionalIdeal.instCoeTCIdeal {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
CoeTC () ()

Map an ideal I to a fractional ideal by forgetting I is integral.

This is a bundled version of IsLocalization.coeSubmodule : Ideal R → Submodule R P, which is not to be confused with the coe : FractionalIdeal S P → Submodule R P, also called coeToSubmodule in theorem names.

This map is available as a ring hom, called FractionalIdeal.coeIdealHom.

Equations
• FractionalIdeal.instCoeTCIdeal = { coe := fun (I : ) => I }
@[simp]
theorem FractionalIdeal.coe_coeIdeal {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
I =
@[simp]
theorem FractionalIdeal.mem_coeIdeal {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] {x : P} {I : } :
x I x'I, () x' = x
theorem FractionalIdeal.mem_coeIdeal_of_mem {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] {x : R} {I : } (hx : x I) :
() x I
theorem FractionalIdeal.coeIdeal_le_coeIdeal' {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] [] (h : ) {I : } {J : } :
I J I J
@[simp]
theorem FractionalIdeal.coeIdeal_le_coeIdeal {R : Type u_1} [] (K : Type u_3) [] [Algebra R K] [] {I : } {J : } :
I J I J
instance FractionalIdeal.instZero {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] :
Zero ()
Equations
• = { zero := 0 }
@[simp]
theorem FractionalIdeal.mem_zero_iff {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] {x : P} :
x 0 x = 0
@[simp]
theorem FractionalIdeal.coe_zero {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
0 =
@[simp]
theorem FractionalIdeal.coeIdeal_bot {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
= 0
@[simp]
theorem FractionalIdeal.exists_mem_algebraMap_eq {R : Type u_1} [] {S : } (P : Type u_2) [] [Algebra R P] [loc : ] {x : R} {I : } (h : ) :
(x'I, () x' = () x) x I
theorem FractionalIdeal.coeIdeal_injective' {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [loc : ] (h : ) :
Function.Injective fun (I : ) => I
theorem FractionalIdeal.coeIdeal_inj' {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [loc : ] (h : ) {I : } {J : } :
I = J I = J
theorem FractionalIdeal.coeIdeal_eq_zero' {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [loc : ] {I : } (h : ) :
I = 0 I =
theorem FractionalIdeal.coeIdeal_ne_zero' {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [loc : ] {I : } (h : ) :
I 0 I
theorem FractionalIdeal.coeToSubmodule_eq_bot {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
I = I = 0
theorem FractionalIdeal.coeToSubmodule_ne_bot {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
I I 0
instance FractionalIdeal.instInhabited {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
• FractionalIdeal.instInhabited = { default := 0 }
instance FractionalIdeal.instOne {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
One ()
Equations
• FractionalIdeal.instOne = { one := }
theorem FractionalIdeal.zero_of_num_eq_bot {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] [] (hS : 0S) {I : } (hI : I.num = ) :
I = 0
theorem FractionalIdeal.num_zero_eq {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (h_inj : Function.Injective ()) :
@[simp]
theorem FractionalIdeal.coeIdeal_top {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] :
= 1
theorem FractionalIdeal.mem_one_iff {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] {x : P} :
x 1 ∃ (x' : R), () x' = x
theorem FractionalIdeal.coe_mem_one {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] (x : R) :
() x 1
theorem FractionalIdeal.one_mem_one {R : Type u_1} [] (S : ) {P : Type u_2} [] [Algebra R P] :
1 1
theorem FractionalIdeal.coe_one_eq_coeSubmodule_top {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :

(1 : FractionalIdeal S P) is defined as the R-submodule f(R) ≤ P.

However, this is not definitionally equal to 1 : Submodule R P, which is proved in the actual simp lemma coe_one.

@[simp]
theorem FractionalIdeal.coe_one {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
1 = 1

### Lattice section #

Defines the order on fractional ideals as inclusion of their underlying sets, and ports the lattice structure on submodules to fractional ideals.

@[simp]
theorem FractionalIdeal.coe_le_coe {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } :
I J I J
theorem FractionalIdeal.zero_le {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
0 I
instance FractionalIdeal.orderBot {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
• FractionalIdeal.orderBot =
@[simp]
theorem FractionalIdeal.bot_eq_zero {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
= 0
@[simp]
theorem FractionalIdeal.le_zero_iff {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
I 0 I = 0
theorem FractionalIdeal.eq_zero_iff {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
I = 0 xI, x = 0
theorem IsFractional.sup {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } :
IsFractional S (I J)
theorem IsFractional.inf_right {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
∀ (J : ), IsFractional S (I J)
instance FractionalIdeal.instInf {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Inf ()
Equations
• FractionalIdeal.instInf = { inf := fun (I J : ) => I J, }
@[simp]
theorem FractionalIdeal.coe_inf {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
(I J) = I J
instance FractionalIdeal.instSup {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Sup ()
Equations
• FractionalIdeal.instSup = { sup := fun (I J : ) => I J, }
theorem FractionalIdeal.coe_sup {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
(I J) = I J
instance FractionalIdeal.lattice {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
instance FractionalIdeal.instSemilatticeSup {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
• FractionalIdeal.instSemilatticeSup = let __src := FractionalIdeal.lattice;
instance FractionalIdeal.instAdd {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
• FractionalIdeal.instAdd = { add := fun (x x_1 : ) => x x_1 }
@[simp]
theorem FractionalIdeal.sup_eq_add {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
I J = I + J
@[simp]
theorem FractionalIdeal.coe_add {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
(I + J) = I + J
@[simp]
theorem FractionalIdeal.coeIdeal_sup {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
(I J) = I + J
theorem IsFractional.nsmul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } (n : ) :
IsFractional S (n I)
instance FractionalIdeal.instSMulNat {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
• FractionalIdeal.instSMulNat = { smul := fun (n : ) (I : ) => n I, }
theorem FractionalIdeal.coe_nsmul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (n : ) (I : ) :
(n I) = n I
theorem IsFractional.mul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } :
IsFractional S (I * J)
theorem IsFractional.pow {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } (h : ) (n : ) :
IsFractional S (I ^ n)
theorem FractionalIdeal.mul_def' {R : Type u_3} [] {S : } {P : Type u_4} [] [Algebra R P] (I : ) (J : ) :
I.mul J = I * J,
@[irreducible]
def FractionalIdeal.mul {R : Type u_3} [] {S : } {P : Type u_4} [] [Algebra R P] (I : ) (J : ) :

FractionalIdeal.mul is the product of two fractional ideals, used to define the Mul instance.

This is only an auxiliary definition: the preferred way of writing I.mul J is I * J.

Elaborated terms involving FractionalIdeal tend to grow quite large, so by making definitions irreducible, we hope to avoid deep unfolds.

Equations
Instances For
instance FractionalIdeal.instMul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Mul ()
Equations
• FractionalIdeal.instMul = { mul := fun (I J : ) => I.mul J }
@[simp]
theorem FractionalIdeal.mul_eq_mul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
I.mul J = I * J
theorem FractionalIdeal.mul_def {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
I * J = I * J,
@[simp]
theorem FractionalIdeal.coe_mul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
(I * J) = I * J
@[simp]
theorem FractionalIdeal.coeIdeal_mul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (J : ) :
(I * J) = I * J
theorem FractionalIdeal.mul_left_mono {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
Monotone fun (x : ) => I * x
theorem FractionalIdeal.mul_right_mono {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) :
Monotone fun (J : ) => J * I
theorem FractionalIdeal.mul_mem_mul {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } {i : P} {j : P} (hi : i I) (hj : j J) :
i * j I * J
theorem FractionalIdeal.mul_le {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } {K : } :
I * J K iI, jJ, i * j K
instance FractionalIdeal.instPowNat {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Pow ()
Equations
• FractionalIdeal.instPowNat = { pow := fun (I : ) (n : ) => I ^ n, }
@[simp]
theorem FractionalIdeal.coe_pow {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (I : ) (n : ) :
(I ^ n) = I ^ n
theorem FractionalIdeal.mul_induction_on {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } {C : PProp} {r : P} (hr : r I * J) (hm : iI, jJ, C (i * j)) (ha : ∀ (x y : P), C xC yC (x + y)) :
C r
instance FractionalIdeal.instNatCast {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
• FractionalIdeal.instNatCast = { natCast := Nat.unaryCast }
theorem FractionalIdeal.coe_natCast {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (n : ) :
n = n
@[deprecated FractionalIdeal.coe_natCast]
theorem FractionalIdeal.coe_nat_cast {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] (n : ) :
n = n

Alias of FractionalIdeal.coe_natCast.

instance FractionalIdeal.commSemiring {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] :
Equations
@[simp]
theorem FractionalIdeal.coeSubmoduleHom_apply {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] (I : ) :
= I
def FractionalIdeal.coeSubmoduleHom {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] :

FractionalIdeal.coeToSubmodule as a bundled RingHom.

Equations
• = { toFun := FractionalIdeal.coeToSubmodule, map_one' := , map_mul' := , map_zero' := , map_add' := }
Instances For
theorem FractionalIdeal.add_le_add_left {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } (hIJ : I J) (J' : ) :
J' + I J' + J
theorem FractionalIdeal.mul_le_mul_left {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } {J : } (hIJ : I J) (J' : ) :
J' * I J' * J
theorem FractionalIdeal.le_self_mul_self {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } (hI : 1 I) :
I I * I
theorem FractionalIdeal.mul_self_le_self {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } (hI : I 1) :
I * I I
theorem FractionalIdeal.coeIdeal_le_one {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
I 1
theorem FractionalIdeal.le_one_iff_exists_coeIdeal {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {J : } :
J 1 ∃ (I : ), I = J
@[simp]
theorem FractionalIdeal.one_le {R : Type u_1} [] {S : } {P : Type u_2} [] [Algebra R P] {I : } :
1 I 1 I
@[simp]
theorem FractionalIdeal.coeIdealHom_apply {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] (I : ) :
I = I
def FractionalIdeal.coeIdealHom {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] :

coeIdealHom (S : Submonoid R) P is (↑) : Ideal R → FractionalIdeal S P as a ring hom

Equations
• = { toFun := FractionalIdeal.coeIdeal, map_one' := , map_mul' := , map_zero' := , map_add' := }
Instances For
theorem FractionalIdeal.coeIdeal_pow {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] (I : ) (n : ) :
(I ^ n) = I ^ n
theorem FractionalIdeal.coeIdeal_finprod {R : Type u_1} [] (S : ) (P : Type u_2) [] [Algebra R P] [] {α : Sort u_3} {f : α} (hS : ) :
(∏ᶠ (a : α), f a) = ∏ᶠ (a : α), (f a)
theorem FractionalIdeal.fg_of_isNoetherianRing {R : Type u_3} [] [] {S : } {P : Type u_4} [] [] [Algebra R P] [] [hR : ] (hS : ) (I : ) :
(I).FG

The fractional ideals of a Noetherian ring are finitely generated.