You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: field.go
    path of file: ./repos/scan4all/vendor/github.com/cloudflare/circl/pke/kyber/internal/common
    
    the code of the file until where you have to start completion: package common

// Given -2¹⁵ q ≤ x < 2¹⁵ q, returns -q < y < q with x 2⁻¹⁶ = y (mod q).
func montReduce(x int32) int16 {
	// This is Montgomery reduction with R=2¹⁶.
	//
	// Note gcd(2¹⁶, q) = 1 as q is prime.  Write q' := 62209 = q⁻¹ mod R.
	// First we compute
	//
	//	m := ((x mod R) q') mod R
	//     = x q' mod R
	//	   = int16(x q')
	//	   = int16(int32(x) * int32(q'))
	//
	// Note that x q' might be as big as 2³² and could overflow the int32
	// multiplication in the last line.  However for any int32s a and b,
	// we have int32(int64(a)*int64(b)) = int32(a*b) and so the result is ok.
	m :
    
func montReduce(x int32) int16 {
	// This is Montgomery reduction with R=2¹⁶.
	//
	// Note gcd(2¹⁶, q) = 1 as q is prime.  Write q' := 62209 = q⁻¹ mod R.
	// First we compute
	//
	//	m := ((x mod R) q') mod R
	//     = x q' mod R
	//	   = int16(x q')
	//	   = int16(int32(x) * int32(q'))
	//
	// Note that x q' might be as big as 2³² and could overflow the int32
	// multiplication in the last line.  However for any int32s a and b,
	// we have int32(int64(a)*int64(b)) = int32(a*b) and so the result is ok.
	m := int16(x * 62209)

	// Note that x - m q is divisable by R; indeed modulo R we have
	//
	//  x - m q ≡ x - x q' q ≡ x - x q⁻¹ q ≡ x - x = 0.
	//
	// We return y := (x - m q) / R.  Note that y is indeed correct as
	// modulo q we have
	//
	//  y ≡ x R⁻¹ - m q R⁻¹ = x R⁻¹
	//
	// and as both 2¹⁵ q ≤ m q, x < 2¹⁵ q, we have
	// 2¹⁶ q ≤ x - m q < 2¹⁶ and so q ≤ (x - m q) / R < q as desired.
	return int16(uint32(x-int32(m)*int32(Q)) >> 16)
}