Last chance! 50% off unlimited learning
Sale ends in
Overload of “all” standard tools useful for matrix manipulation adapted to large numbers.
# S3 method for bigz
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL, mod = NA,...)is.matrixZQ(x)
# S3 method for bigz
%*%(x, y)
# S3 method for bigq
%*%(x, y)
# S3 method for bigq
crossprod(x, y=NULL)
# S3 method for bigz
tcrossprod(x, y=NULL)
## ..... etc
an optional data vector
the desired number of rows
the desired number of columns
logical. If FALSE
(the default), the matrix is filled by
columns, otherwise the matrix is filled by rows.
not implemented for "bigz"
or "bigq"
matrices.
optional modulus (when data
is "bigz"
).
Not used
numeric, bigz
, or bigq
matrices or vectors.
matrix()
: A matrix of class "bigz"
or "bigq"
.
is.matrixZQ()
: TRUE
or FALSE
.
dim()
, ncol()
, etc: integer or NULL
, as for
simple matrices.
The extract function ("["
) is the same use for vector or
matrix. Hence, x[i]
returns the same values as x[i,]
.
This is not considered a feature and may be changed in the future
(with warnings).
All matrix multiplications should work as with numeric matrices.
Special features concerning the "bigz"
class: the
modulus can be
Just play with large numbers
Example:
matrix.bigz(1:6,nrow=2,ncol=3,mod=7)
This means you work
in %*%
and solve
functions will work
in
Example:
matrix.bigz(1:6,nrow=2,ncol=3,mod=1:5)
. Then, the modulus
is repeated to the end of data. This can be used to define a
matrix with a different modulus at each row.
Modulus is defined for each cell
Solving a linear system: solve.bigz
.
matrix
# NOT RUN {
V <- as.bigz(v <- 3:7)
crossprod(V)# scalar product
(C <- t(V))
stopifnot(dim(C) == dim(t(v)), C == v,
dim(t(C)) == c(length(v), 1),
crossprod(V) == sum(V * V),
tcrossprod(V) == outer(v,v),
identical(C, t(t(C))),
is.matrixZQ(C), !is.matrixZQ(V), !is.matrixZQ(5)
)
## a matrix
x <- diag(1:4)
## invert this matrix
(xI <- solve(x))
## matrix in Z/7Z
y <- as.bigz(x,7)
## invert this matrix (result is *different* from solve(x)):
(yI <- solve(y))
stopifnot(yI %*% y == diag(4),
y %*% yI == diag(4))
## matrix in Q
z <- as.bigq(x)
## invert this matrix (result is the same as solve(x))
(zI <- solve(z))
stopifnot(abs(zI - xI) <= 1e-13,
z %*% zI == diag(4),
identical(crossprod(zI), zI %*% t(zI))
)
A <- matrix(2^as.bigz(1:12), 3,4)
for(a in list(A, as.bigq(A, 16), factorialZ(20), as.bigq(2:9, 3:4))) {
a.a <- crossprod(a)
aa. <- tcrossprod(a)
stopifnot(identical(a.a, crossprod(a,a)),
identical(a.a, t(a) %*% a)
,
identical(aa., tcrossprod(a,a)),
identical(aa., a %*% t(a))
)
}# {for}
# }
Run the code above in your browser using DataLab