A Formalization of the Berlekamp-Zassenhaus Factorization Algorithm

General

This site provides supporting material for the paper Formalization of the Berlekamp-Zassenhaus Factorization Algorithm by José Divasón, Sebastiaan Joosten, René Thiemann and Akihisa Yamada.

We formalize the Berlekamp-Zassenhaus algorithm for factoring square-free integer polynomials in Isabelle/HOL. We further adapt an existing formalization of Yun's square-free factorization algorithm to integer polynomials, and thus provide an efficient and certified factorization algorithm for arbitrary univariate polynomials.

The algorithm first performs a factorization in the prime field GF(p) and then performs computations in the integer ring modulo pk, where both p and k are determined at runtime. Since a natural modeling of these structures via dependent types is not possible in Isabelle/HOL, we formalize the whole algorithm using Isabelle's recent addition of local type definitions.

Through experiments we verify that our algorithm factors polynomials of degree 100 within seconds.


Formalization

The formalization is part of the Archive of Formal Proofs, revision c57b0e9b0d65, which compiles with Isabelle revision 03057a8fdd1f.

Experimental results

One can rerun the experimental results as follows:

  1. Generate the directory ~/Code and either open Tests.thy in Isabelle to generate the required Haskell sources or copy them from the Code directory in the archive. If you have trouble with this step, or do not wish to install Isabelle, you can download the directory Code as a zip.
  2. Inspect the path of the constant binary within the file Code/Mathematica.hs whether it matches your Mathematica installation. Otherwise you can deactivate the Mathematica experiments by disabling the external factorization in experimental_data/run_experiment.sh.
  3. Compile the Haskell code with GHC: ghc --make Main -O2
  4. Download and unzip the experiments and go to this directory, from which you run the script run_experiments.sh. This will generate results and runtimes for each polynomial.
  5. Run run_comparisonTime.sh to get the runtimes in a nicer format.
The polynomials we used for testing are included in the zip, but so is the code to generate them. You can run generate.sh to do this. This requires random to be installed, which can be done by running cabal install random.

All results can also be inspected in the following table. You can click in each column, to view the input polynomial and the computed factorizations, resp. The timing informations have been obtained on a computer running macOS Sierra 10.12 on a 6-core Intel Xeon E5 processor at 3.5 Ghz.


Polynomialfactorize_int_polyMathematica
poly_100.poly 0.314s 0.591s
poly_101.poly 0.343s 0.457s
poly_102.poly 0.422s 0.492s
poly_103.poly 0.273s 0.488s
poly_104.poly 0.212s 0.471s
poly_105.poly 0.452s 0.482s
poly_106.poly 0.246s 0.449s
poly_107.poly 0.303s 0.479s
poly_108.poly 0.346s 0.488s
poly_109.poly 0.245s 0.470s
poly_110.poly 0.296s 0.450s
poly_111.poly 0.368s 0.459s
poly_112.poly 0.367s 0.483s
poly_113.poly 0.201s 0.488s
poly_114.poly 0.446s 0.463s
poly_115.poly 0.392s 0.453s
poly_116.poly 0.430s 0.456s
poly_117.poly 0.552s 0.470s
poly_118.poly 0.352s 0.512s
poly_119.poly 0.370s 0.462s
poly_120.poly 0.535s 0.458s
poly_121.poly 0.458s 0.483s
poly_122.poly 0.367s 0.478s
poly_123.poly 0.413s 0.463s
poly_124.poly 0.466s 0.511s
poly_125.poly 0.632s 0.470s
poly_126.poly 0.492s 0.482s
poly_127.poly 0.531s 0.472s
poly_128.poly 0.422s 0.517s
poly_129.poly 0.682s 0.465s
poly_130.poly 0.415s 0.480s
poly_131.poly 0.531s 0.488s
poly_132.poly 0.786s 0.473s
poly_133.poly 0.737s 0.506s
poly_134.poly 0.522s 0.481s
poly_135.poly 0.696s 0.510s
poly_136.poly 0.700s 0.515s
poly_137.poly 0.445s 0.495s
poly_138.poly 0.532s 0.491s
poly_139.poly 0.546s 0.507s
poly_140.poly 0.661s 0.479s
poly_141.poly 0.694s 0.539s
poly_142.poly 0.476s 0.495s
poly_143.poly 0.464s 0.496s
poly_144.poly 0.858s 0.543s
poly_145.poly 0.714s 0.535s
poly_146.poly 0.796s 0.500s
poly_147.poly 0.992s 0.463s
poly_148.poly 0.615s 0.473s
poly_149.poly 0.919s 0.512s
poly_150.poly 0.376s 0.501s
poly_151.poly 0.912s 0.478s
poly_152.poly 0.827s 0.547s
poly_153.poly 0.821s 0.544s
poly_154.poly 0.588s 0.508s
poly_155.poly 1.068s 0.568s
poly_156.poly 1.010s 0.503s
poly_157.poly 1.150s 0.501s
poly_158.poly 0.787s 0.565s
poly_159.poly 1.522s 0.467s
poly_160.poly 1.044s 0.572s
poly_161.poly 0.996s 0.515s
poly_162.poly 1.599s 0.516s
poly_163.poly 0.979s 0.510s
poly_164.poly 0.706s 0.495s
poly_165.poly 1.364s 0.487s
poly_166.poly 0.958s 0.612s
poly_167.poly 1.369s 0.536s
poly_168.poly 1.268s 0.530s
poly_169.poly 1.758s 0.546s
poly_170.poly 1.136s 0.562s
poly_171.poly 1.080s 0.533s
poly_172.poly 1.071s 0.581s
poly_173.poly 1.211s 0.499s
poly_174.poly 1.132s 0.531s
poly_175.poly 1.126s 0.539s
poly_176.poly 1.058s 0.595s
poly_177.poly 1.738s 0.536s
poly_178.poly 1.265s 0.518s
poly_179.poly 1.891s 0.561s
poly_180.poly 1.076s 0.509s
poly_181.poly 1.431s 0.498s
poly_182.poly 1.826s 0.556s
poly_183.poly 1.251s 0.554s
poly_184.poly 2.631s 0.570s
poly_185.poly 1.670s 0.520s
poly_186.poly 1.820s 0.588s
poly_187.poly 1.734s 0.585s
poly_188.poly 1.449s 0.554s
poly_189.poly 2.314s 0.640s
poly_190.poly 2.007s 0.624s
poly_191.poly 1.634s 0.532s
poly_192.poly 1.618s 0.545s
poly_193.poly 1.377s 0.652s
poly_194.poly 2.163s 0.572s
poly_195.poly 2.364s 0.538s
poly_196.poly 2.443s 0.616s
poly_197.poly 1.965s 0.580s
poly_198.poly 2.075s 0.603s
poly_199.poly 1.647s 0.592s
poly_200.poly 2.216s 0.511s
poly_201.poly 2.427s 0.703s
poly_202.poly 1.858s 0.574s
poly_203.poly 1.942s 0.646s
poly_204.poly 1.675s 0.558s
poly_205.poly 2.414s 0.674s
poly_206.poly 1.770s 0.637s
poly_207.poly 2.773s 0.509s
poly_208.poly 2.305s 0.613s
poly_209.poly 2.594s 0.588s
poly_210.poly 2.827s 0.526s
poly_211.poly 2.193s 0.787s
poly_212.poly 1.907s 0.698s
poly_213.poly 1.934s 0.551s
poly_214.poly 2.946s 0.606s
poly_215.poly 2.777s 0.647s
poly_216.poly 2.452s 0.589s
poly_217.poly 3.157s 0.627s
poly_218.poly 3.829s 0.676s
poly_219.poly 2.731s 0.680s
poly_220.poly 3.316s 0.583s
poly_221.poly 2.143s 0.575s
poly_222.poly 1.790s 0.546s
poly_223.poly 3.217s 0.566s
poly_224.poly 2.797s 0.571s
poly_225.poly 4.783s 0.559s
poly_226.poly 2.739s 0.679s
poly_227.poly 2.358s 0.594s
poly_228.poly 4.172s 0.668s
poly_229.poly 3.005s 0.701s
poly_230.poly 2.581s 0.683s
poly_231.poly 3.189s 0.837s
poly_232.poly 4.211s 1.113s
poly_233.poly 2.937s 5.462s
poly_234.poly 4.844s 0.591s
poly_235.poly 3.810s 0.679s
poly_236.poly 2.743s 0.558s
poly_237.poly 4.602s 3.434s
poly_238.poly 2.199s 0.704s
poly_239.poly 2.426s 0.579s
poly_240.poly 3.654s 0.619s
poly_241.poly 4.622s 0.697s
poly_242.poly 2.999s 0.857s
poly_243.poly 3.765s 0.607s
poly_244.poly 3.606s 0.776s
poly_245.poly 3.832s 0.639s
poly_246.poly 5.342s 0.644s
poly_247.poly 5.119s 2.924s
poly_248.poly 4.454s 0.682s
poly_249.poly 2.998s 0.557s
poly_250.poly 3.897s 0.666s
poly_251.poly 3.597s 0.740s
poly_252.poly 3.778s 0.717s
poly_253.poly 4.985s 0.778s
poly_254.poly 4.822s 0.795s
poly_255.poly 4.068s 0.915s
poly_256.poly 4.637s 0.796s
poly_257.poly 4.349s 0.640s
poly_258.poly 3.031s 0.654s
poly_259.poly 5.428s 0.813s
poly_260.poly 4.568s 0.725s
poly_261.poly 4.464s 0.702s
poly_262.poly 5.194s 0.574s
poly_263.poly 4.712s 4.911s
poly_264.poly 4.596s 0.773s
poly_265.poly 5.893s 0.804s
poly_266.poly 5.305s 0.847s
poly_267.poly 6.149s 0.638s
poly_268.poly 5.133s 0.810s
poly_269.poly 6.909s 0.992s
poly_270.poly 4.951s 1.098s
poly_271.poly 5.076s 0.917s
poly_272.poly 5.262s 0.863s
poly_273.poly 6.559s 0.762s
poly_274.poly 7.471s 0.754s
poly_275.poly 7.107s 1.021s
poly_276.poly 6.671s 0.591s
poly_277.poly 6.681s 1.020s
poly_278.poly 4.989s 0.834s
poly_279.poly 4.284s 1.118s
poly_280.poly 6.817s 0.834s
poly_281.poly 6.920s 0.799s
poly_282.poly 7.233s 1.001s
poly_283.poly 5.726s 0.811s
poly_284.poly 6.487s 0.979s
poly_285.poly 7.329s 0.726s
poly_286.poly 6.183s 0.925s
poly_287.poly 6.201s 1.095s
poly_288.poly 6.449s 0.842s
poly_289.poly 8.956s 0.823s
poly_290.poly 5.708s 0.661s
poly_291.poly 7.335s 0.729s
poly_292.poly 7.769s 0.806s
poly_293.poly 12.086s 0.777s
poly_294.poly 9.575s 0.824s
poly_295.poly 5.592s 1.159s
poly_296.poly 7.603s 0.978s
poly_297.poly 7.563s 1.016s
poly_298.poly 9.576s 1.238s
poly_299.poly 6.426s 0.882s
poly_300.poly 10.037s 0.968s
poly_301.poly 7.575s 0.802s
poly_302.poly 7.844s 1.237s
poly_303.poly 4.542s 1.602s
poly_304.poly 10.229s 0.804s
poly_305.poly 7.261s 0.978s
poly_306.poly 8.187s 0.681s
poly_307.poly 9.132s 1.060s
poly_308.poly 7.246s 0.943s
poly_309.poly 6.947s 1.358s
poly_310.poly 9.128s 1.198s
poly_311.poly 7.790s 0.938s
poly_312.poly 6.690s 0.833s
poly_313.poly 7.582s 2.632s
poly_314.poly 8.558s 1.320s
poly_315.poly 12.465s 0.693s
poly_316.poly 11.321s 1.004s
poly_317.poly 8.260s 1.038s
poly_318.poly 12.035s 1.462s
poly_319.poly 9.455s 0.904s
poly_320.poly 8.270s 1.671s
poly_321.poly 12.701s 1.173s
poly_322.poly 12.531s 1.016s
poly_323.poly 9.750s 0.721s
poly_324.poly 11.132s 1.098s
poly_325.poly 9.570s 1.012s
poly_326.poly 9.927s 0.830s
poly_327.poly 11.564s 0.868s
poly_328.poly 14.349s 1.010s
poly_329.poly 6.067s 1.177s
poly_330.poly 9.585s 0.917s
poly_331.poly 13.194s 1.062s
poly_332.poly 10.783s 0.964s
poly_333.poly 16.013s 1.387s
poly_334.poly 14.077s 1.116s
poly_335.poly 12.133s 1.409s
poly_336.poly 9.130s 1.213s
poly_337.poly 15.361s 0.850s
poly_338.poly 13.140s 0.933s
poly_339.poly 10.464s 0.944s
poly_340.poly 11.546s 0.734s
poly_341.poly 10.056s 1.068s
poly_342.poly 19.184s 1.094s
poly_343.poly 12.622s 1.313s
poly_344.poly 12.841s 0.848s
poly_345.poly 7.543s 1.324s
poly_346.poly 14.581s 1.170s
poly_347.poly 10.965s 1.082s
poly_348.poly 12.999s 0.986s
poly_349.poly 17.885s 0.934s
poly_350.poly 15.338s 1.367s
poly_351.poly 11.132s 2.611s
poly_352.poly 12.996s 1.141s
poly_353.poly 12.620s 0.806s
poly_354.poly 13.172s 1.446s
poly_355.poly 10.623s 1.899s
poly_356.poly 12.183s 1.220s
poly_357.poly 14.716s 0.876s
poly_358.poly 17.769s 1.048s
poly_359.poly 21.355s 1.018s
poly_360.poly 18.227s 1.258s
poly_361.poly 21.652s 2.918s
poly_362.poly 15.886s 7.819s
poly_363.poly 29.052s 1.591s
poly_364.poly 23.220s 2.922s
poly_365.poly 14.246s 1.140s
poly_366.poly 11.984s 2.188s
poly_367.poly 15.655s 1.152s
poly_368.poly 21.449s 1.579s
poly_369.poly 17.163s 0.922s
poly_370.poly 18.380s 0.845s
poly_371.poly 17.553s 1.556s
poly_372.poly 9.942s 0.982s
poly_373.poly 13.430s 1.750s
poly_374.poly 18.983s 1.120s
poly_375.poly 13.751s 1.159s
poly_376.poly 12.755s 1.733s
poly_377.poly 14.092s 1.521s
poly_378.poly 18.246s 1.254s
poly_379.poly 16.454s 0.902s
poly_380.poly 17.396s 1.684s
poly_381.poly 12.669s 1.576s
poly_382.poly 13.393s 1.037s
poly_383.poly 18.960s 1.101s
poly_384.poly 25.977s 1.221s
poly_385.poly 19.292s 1.213s
poly_386.poly 14.645s 1.513s
poly_387.poly 19.407s 1.135s
poly_388.poly 11.395s 0.824s
poly_389.poly 14.119s 1.044s
poly_390.poly 11.376s 0.867s
poly_391.poly 26.941s 0.892s
poly_392.poly 24.170s 1.642s
poly_393.poly 15.861s 1.276s
poly_394.poly 19.948s 1.123s
poly_395.poly 17.668s 1.386s
poly_396.poly 18.966s 1.160s
poly_397.poly 20.846s 2.189s
poly_398.poly 18.195s 1.011s
poly_399.poly 27.978s 1.616s
poly_400.poly 18.411s 1.417s
poly_401.poly 11.574s 1.253s
poly_402.poly 15.913s 2.260s
poly_403.poly 15.563s 1.153s
poly_404.poly 27.279s 1.223s
poly_405.poly 32.654s 1.943s
poly_406.poly 22.719s 1.189s
poly_407.poly 22.873s 1.274s
poly_408.poly 27.974s 1.356s
poly_409.poly 18.114s 1.270s
poly_410.poly 16.557s 1.409s
poly_411.poly 23.626s 1.863s
poly_412.poly 32.881s 1.450s
poly_413.poly 20.205s 0.995s
poly_414.poly 27.521s 1.366s
poly_415.poly 40.337s 1.339s
poly_416.poly 21.410s 1.460s
poly_417.poly 24.638s 1.793s
poly_418.poly 19.170s 2.304s
poly_419.poly 25.634s 1.668s
poly_420.poly 17.872s 1.214s
poly_421.poly 28.332s 2.778s
poly_422.poly 34.186s 1.775s
poly_423.poly 31.685s 1.476s
poly_424.poly 19.518s 1.083s
poly_425.poly 26.002s 1.396s
poly_426.poly 19.854s 1.107s
poly_427.poly 27.849s 1.489s
poly_428.poly 37.592s 1.399s
poly_429.poly 28.264s 1.159s
poly_430.poly 32.634s 1.438s
poly_431.poly 26.179s 2.025s
poly_432.poly 38.186s 1.429s
poly_433.poly 20.297s 1.403s
poly_434.poly 28.903s 2.099s
poly_435.poly 15.635s 1.808s
poly_436.poly 20.767s 1.953s
poly_437.poly 20.477s 1.311s
poly_438.poly 27.567s 2.022s
poly_439.poly 33.740s 1.707s
poly_440.poly 35.064s 1.333s
poly_441.poly 34.269s 1.627s
poly_442.poly 16.733s 0.997s
poly_443.poly 45.502s 1.087s
poly_444.poly 25.055s 1.209s
poly_445.poly 22.734s 2.453s
poly_446.poly 36.493s 1.217s
poly_447.poly 40.564s 1.501s
poly_448.poly 22.168s 1.993s
poly_449.poly 24.300s 1.976s
poly_450.poly 31.642s 1.931s
poly_451.poly 30.811s 2.079s
poly_452.poly 41.513s 1.668s
poly_453.poly 29.647s 2.403s
poly_454.poly 50.789s 1.903s
poly_455.poly 40.368s 2.307s
poly_456.poly 30.978s 1.843s
poly_457.poly 32.390s 1.122s
poly_458.poly 36.272s 2.726s
poly_459.poly 39.691s 2.473s
poly_460.poly 28.964s 1.467s
poly_461.poly 24.958s 1.447s
poly_462.poly 41.638s 1.835s
poly_463.poly 47.541s 1.765s
poly_464.poly 37.479s 2.702s
poly_465.poly 46.203s 1.736s
poly_466.poly 43.263s 1.660s
poly_467.poly 38.858s 1.514s
poly_468.poly 23.208s 2.563s
poly_469.poly 46.143s 2.851s
poly_470.poly 24.874s 2.794s
poly_471.poly 31.498s 2.439s
poly_472.poly 31.534s 2.862s
poly_473.poly 48.444s 4.012s
poly_474.poly 46.405s 1.596s
poly_475.poly 36.252s 1.211s
poly_476.poly 32.773s 1.942s
poly_477.poly 34.189s 1.870s
poly_478.poly 42.079s 1.762s
poly_479.poly 42.770s 1.817s
poly_480.poly 46.371s 2.059s
poly_481.poly 40.468s 2.794s
poly_482.poly 38.029s 3.307s
poly_483.poly 26.563s 3.190s
poly_484.poly 57.333s 2.296s
poly_485.poly 43.051s 3.032s
poly_486.poly 42.759s 1.893s
poly_487.poly 39.922s 2.192s
poly_488.poly 54.524s 1.385s
poly_489.poly 53.623s 2.410s
poly_490.poly 49.670s 1.296s
poly_491.poly 49.999s 2.613s
poly_492.poly 41.173s 2.587s
poly_493.poly real 1m2.738s 1.534s
poly_494.poly 46.645s 2.075s
poly_495.poly 43.190s 2.879s
poly_496.poly 46.940s 2.534s
poly_497.poly 53.151s 2.453s
poly_498.poly 50.801s 2.362s
poly_499.poly 52.697s 1.997s