@@ -114,20 +114,40 @@ else
114
114
end
115
115
end
116
116
117
+ function bareiss_update! (zero!, M:: StridedMatrix , k, swapto, pivot, prev_pivot:: Base.BitInteger )
118
+ flag = zero (prev_pivot)
119
+ prev_pivot = Base. MultiplicativeInverses. SignedMultiplicativeInverse (prev_pivot)
120
+ @inbounds for i in k+ 1 : size (M, 2 )
121
+ Mki = M[k,i]
122
+ @simd ivdep for j in k+ 1 : size (M, 1 )
123
+ M[j,i], r = divrem (M[j,i]* pivot - M[j,k]* Mki, prev_pivot)
124
+ flag = flag | r
125
+ end
126
+ end
127
+ iszero (flag) || error (" Overflow occurred" )
128
+ zero! (M, k+ 1 : size (M, 1 ), k)
129
+ end
130
+
117
131
function bareiss_update! (zero!, M:: StridedMatrix , k, swapto, pivot, prev_pivot)
118
- for i in k+ 1 : size (M, 2 ), j in k+ 1 : size (M, 1 )
132
+ @inbounds for i in k+ 1 : size (M, 2 ), j in k+ 1 : size (M, 1 )
119
133
M[j,i] = exactdiv (M[j,i]* pivot - M[j,k]* M[k,i], prev_pivot)
120
134
end
121
135
zero! (M, k+ 1 : size (M, 1 ), k)
122
136
end
123
137
124
138
@views function bareiss_update! (zero!, M:: AbstractMatrix , k, swapto, pivot, prev_pivot)
139
+ if prev_pivot isa Base. BitInteger
140
+ prev_pivot = Base. MultiplicativeInverses. SignedMultiplicativeInverse (prev_pivot)
141
+ end
125
142
V = M[k+ 1 : end , k+ 1 : end ]
126
143
V .= exactdiv .(V .* pivot .- M[k+ 1 : end , k] * M[k, k+ 1 : end ]' , prev_pivot)
127
144
zero! (M, k+ 1 : size (M, 1 ), k)
128
145
end
129
146
130
147
function bareiss_update_virtual_colswap! (zero!, M:: AbstractMatrix , k, swapto, pivot, prev_pivot)
148
+ if prev_pivot isa Base. BitInteger
149
+ prev_pivot = Base. MultiplicativeInverses. SignedMultiplicativeInverse (prev_pivot)
150
+ end
131
151
V = @view M[k+ 1 : end , :]
132
152
V .= @views exactdiv .(V .* pivot .- M[k+ 1 : end , swapto[2 ]] * M[k, :]' , prev_pivot)
133
153
zero! (M, k+ 1 : size (M, 1 ), swapto[2 ])
0 commit comments