# isFreeDivisor -- check if the provided information is associated with a free divisor

## Synopsis

• Usage:
t=isFreeDivisor(M)
t=isFreeDivisor(m)
t=isFreeDivisor(f)
• Inputs:
• M, , of vector fields, usually square
• m, , of vector fields
• f, , a polynomial defining a hypersurface
• Outputs:
• t, , whether M or m generate the module of vector fields for a free divisor, or whether f=0 defines a free divisor

## Description

Determine whether the given object is associated to a free divisor, using a variety of methods. A free divisor is a hypersurface germ $X$ for which the associated module of logarithmic vector fields (see derlog) is free.

When given a RingElement f, this tests whether f=0 is a free divisor by computing derlog(ideal (f)) and then testing if this is a free module by computing a partial resolution. This method may give false negatives if the resolution computed is not minimal; use with caution.

When given a Matrix M, this tests whether the given vector fields are a free set of generators of the module of logarithmic vector fields for a free divisor. A criterion of Kyoji Saito is used: if the number of vector fields provided equals the dimension of the ambient space (i.e., M is square), the vector fields generate a Lie algebra, and the determinant of the matrix is reduced (square-free), then the provided vector fields are a free basis of the free module derlog(ideal det(M)), and det(M)=0 defines a free divisor. This method may give false negatives if redundant generators are provided.

When given a Module, this tests whether the module is the module of logarithmic vector fields of a free divisor. The method applies the Matrix version of the command to the generators given by gens(m). If the generators provided by generators are not minimal, then this may give false negatives; use trim first.

For example, this is not a free divisor:

 i1 : R=QQ[a,b,c]; i2 : f=a*c-b^2; i3 : M=derlog(ideal (f)) o3 = image | 2b a 0 0 | | c 0 b a | | 0 -c 2c 2b | 3 o3 : R-module, submodule of R i4 : isFreeDivisor(gens M) o4 = false i5 : isFreeDivisor(M) o5 = false i6 : isFreeDivisor(f) o6 = false

This is a free divisor:

 i7 : f=a*(a*c-b^2); i8 : M=derlog(ideal (f)) o8 = image | a 0 0 | | 0 b a | | -c 2c 2b | 3 o8 : R-module, submodule of R i9 : isFreeDivisor(gens M) o9 = true i10 : isFreeDivisor(M) o10 = true i11 : isFreeDivisor(f) o11 = true

This is a free divisor:

 i12 : f=a; i13 : D=derlog(ideal (f)) o13 = image | 0 0 a | | 1 0 0 | | 0 1 0 | 3 o13 : R-module, submodule of R i14 : isFreeDivisor(f) o14 = true i15 : isFreeDivisor(D) o15 = true

but the vector fields in M are not a generating set of the logarithmic vector fields:

 i16 : M=matrix {{a,0,0},{0,a,0},{0,0,1}}; 3 3 o16 : Matrix R <--- R i17 : isSubset(image M,D) o17 = true i18 : isFreeDivisor(M) o18 = false

False negatives can occur with a set of generators that is not minimal:

 i19 : isFreeDivisor((gens D)|M) o19 = false i20 : isFreeDivisor(trim image ((gens D)|M)) o20 = true

• VectorFields -- a package for manipulating polynomial vector fields
• isLieAlgebra -- check that a module of vector fields is closed under the Lie bracket
• derlog -- compute the logarithmic (tangent) vector fields to an ideal

## Ways to use isFreeDivisor :

• "isFreeDivisor(Matrix)"
• "isFreeDivisor(Module)"
• "isFreeDivisor(RingElement)"

## For the programmer

The object isFreeDivisor is .