Skip to content

A modular arithmetic library in go with an emphasis on speed

License

Notifications You must be signed in to change notification settings

stewi1014/modular

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

modular

This library was built for an old version of golang. Modern golang versions use hardware mod functions, so this library is likely useless now.

A modular arithmetic library with an emphasis on speed Status

Float64 GoDoc

Float32 GoDoc

Modular tries to leverage pre-computation as much as possible to allow direct computation in Congruent() and Index(), using fastdiv and pre-computed lookup tables. I can't test it on all hardware, but in principle should perform better than traditional modulo functions on all but the strangest of hardware.

For example, on my machine with a modulo of 1e-25;

float64

Number Math.Mod Modulus.Congruent Indexer.Index
0 14.1 ns/op 6.07 ns/op 12.4 ns/op
2.5e-25 29.2 ns/op 14.4 ns/op 15.7 ns/op
1 467 ns/op 37.5 ns/op 38.1 ns/op
1e300 8063 ns/op 36.3 ns/op 39.4 ns/op

float32

Number Math.Mod Modulus.Congruent Indexer.Index
0 15.6 ns/op 5.49 ns/op 11.3 ns/op
2.5e-25 33.5 ns/op 12.1 ns/op 11.3 ns/op
1 766 ns/op 12.0 ns/op 10.9 ns/op
1e25 1259 ns/op 12.0 ns/op 11.0 ns/op

I've use the name 'Congruent' as it's a more explicit definition of the function, and helps avoid confusion with other functions. It is the same as a euclidian 'modulo' function; that is, it finds the number satisfying '0 <= n < modulus' that is representative of the given number's congruency class, hence the name Congruent.

About

A modular arithmetic library in go with an emphasis on speed

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages