Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
63
Task/Modular-arithmetic/Go/modular-arithmetic.go
Normal file
63
Task/Modular-arithmetic/Go/modular-arithmetic.go
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
// Define enough of a ring to meet the needs of the task. Addition and
|
||||
// multiplication are mentioned in the task; multiplicative identity is not
|
||||
// mentioned but is useful for the power function.
|
||||
|
||||
type ring interface {
|
||||
add(ringElement, ringElement) ringElement
|
||||
mul(ringElement, ringElement) ringElement
|
||||
mulIdent() ringElement
|
||||
}
|
||||
|
||||
type ringElement interface{}
|
||||
|
||||
// Define a power function that works for any ring.
|
||||
|
||||
func ringPow(r ring, a ringElement, p uint) (pow ringElement) {
|
||||
for pow = r.mulIdent(); p > 0; p-- {
|
||||
pow = r.mul(pow, a)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// The task function f has that constant 1 in it.
|
||||
// Define a special kind of ring that has this element.
|
||||
|
||||
type oneRing interface {
|
||||
ring
|
||||
one() ringElement // return ring element corresponding to '1'
|
||||
}
|
||||
|
||||
// Now define the required function f.
|
||||
// It works for any ring (that has a "one.")
|
||||
|
||||
func f(r oneRing, x ringElement) ringElement {
|
||||
return r.add(r.add(ringPow(r, x, 100), x), r.one())
|
||||
}
|
||||
|
||||
// With rings and the function f defined in a general way, now define
|
||||
// the specific ring of integers modulo n.
|
||||
|
||||
type modRing uint // value is congruence modulus n
|
||||
|
||||
func (m modRing) add(a, b ringElement) ringElement {
|
||||
return (a.(uint) + b.(uint)) % uint(m)
|
||||
}
|
||||
|
||||
func (m modRing) mul(a, b ringElement) ringElement {
|
||||
return (a.(uint) * b.(uint)) % uint(m)
|
||||
}
|
||||
|
||||
func (modRing) mulIdent() ringElement { return uint(1) }
|
||||
|
||||
func (modRing) one() ringElement { return uint(1) }
|
||||
|
||||
// Demonstrate the general function f on the specific ring with the
|
||||
// specific values.
|
||||
|
||||
func main() {
|
||||
fmt.Println(f(modRing(13), uint(10)))
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue